Лучший способ предотвратить перенос ошибки? - PullRequest
0 голосов
/ 03 декабря 2011

У меня есть большой массив данных, созданный путем выборки напряжения на 250 кГц.Я хотел бы распечатать данные вместе с соответствующим временем в файл.Мой первый подход заключается в том, чтобы сделать это следующим образом (в C #):

decimal dt = 1m / sampleRate;
decimal t = 0;

for(int i = 0; i < dataArray.Length; i++)
{
    Writer.WriteLine(t + "\t" + dataArray[i]);

    t += dt;  //Would using t = i * dt; be any different?
}

Очевидно, из-за присущей математики с плавающей запятой этого подхода, он начинает накапливать ошибку, котораястановится значимым после нескольких секунд данных.

Мой подход к решению этой проблемы будет выглядеть примерно так:

decimal dt = (decimal)(1 / sampleRate);
decimal t = 0;
int seconds = 0;

for(int i = 0; i < dataArray.Length; i++)
{
    if(i % sampleRate == 0)
        {
            t = seconds;
            seconds++;
        }
    Writer.WriteLine(t + "\t" + dataArray[i]);

    t += dt;  
}

, который поддерживает синхронизацию всего достаточно хорошо, но не выглядит особенно элегантным.Есть ли лучший способ приблизиться к этому?И, наконец, в верхнем подходе использование t + = dt отличается от t = i * dt с десятичной дробью?Как насчет двойного?

РЕДАКТИРОВАТЬ: Как было указано, десятичная дробь не является плавающей точкой.Должен ли я использовать десятичную или двойную здесь?

Ответы [ 2 ]

1 голос
/ 03 декабря 2011

Вы используете decimal, который является фиксированной точкой. У вас не должно быть ошибок (если, конечно, ваши значения выходят за пределы поддерживаемого диапазона decimal).

Впрочем, ваше первое утверждение неверно. Вы делаете целочисленную математику (с результатом приведет к целочисленному результату), а затем приводите к десятичному числу. Вам нужно сделать что-то немного по-другому, чтобы правильно вычислить:

decimal dt = 1m / sampleRate;
1 голос
/ 03 декабря 2011

Поскольку вы используете decimal, вы не выполняете математику с плавающей точкой.decimal - это в основном число с фиксированной запятой.

...