0

我有一个通过以 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 有什么不同?双打呢?

编辑:正如已经指出的那样,十进制不是浮点数。我应该在这里使用十进制还是双精度?

4

2 回答 2

1

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

于 2011-12-02T20:23:12.930 回答
1

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

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

decimal dt = 1m / sampleRate;
于 2011-12-02T20:26:09.993 回答