我通过采样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有什么不同的小数?用双人怎么样?
编辑:正如已经指出的那样,十进制不是浮点数。我应该在这里使用小数还是双倍?
答案 0 :(得分:1)
由于您使用的是decimal
,因此您不进行浮点运算。 decimal
基本上是一个定点数。
答案 1 :(得分:1)
您正在使用decimal
,这是固定点。您不应该有任何错误(当然,除非您的值超出decimal
支持的范围。)
但是,您的第一个陈述是不正确的。您正在进行整数数学运算(将导致整数结果),然后转换为小数。你需要做一些不同的事情来强制计算:
decimal dt = 1m / sampleRate;