防止错误发生的最佳方法是什么?

时间:2011-12-02 20:20:00

标签: c# floating-point fixed-point

我通过采样250 kHz的电压来创建一个大型数据阵列。我想将数据与相关时间一起打印到文件中。我的第一种方法是这样做(在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 个答案:

答案 0 :(得分:1)

由于您使用的是decimal,因此您进行浮点运算。 decimal基本上是一个定点数。

答案 1 :(得分:1)

您正在使用decimal,这是固定点。您不应该有任何错误(当然,除非您的值超出decimal支持的范围。)

但是,您的第一个陈述是不正确的。您正在进行整数数学运算(将导致整数结果),然后转换为小数。你需要做一些不同的事情来强制计算:

decimal dt = 1m / sampleRate;