如何正确迭代双精度

时间:2014-11-08 20:18:54

标签: c++ loops floating-point double

我像这样迭代t

double dt = 0.1, t;
double tmax = 100;
for (t = 0; t <= tmax; t += dt) { /*do something*/ }

如果dt为0.1,就像这里一样,一切正常,并为t = 100执行步骤。但是如果我减少步骤,例如dt = 0.001,则不执行最后一步。

我应该如何正确地迭代双打?

3 个答案:

答案 0 :(得分:5)

迭代一个整数并使用开始步公式来获取每个double值。

double dt = 0.1, t;
double tmax = 100;
int i, n = (int)(tmax / dt); // n: check your rounding or specify explicitly.
for (i = 0; i <= n; i++) { t = 0/*start*/ + dt * i; /*do something*/ }

答案 1 :(得分:3)

您的代码很好,并且行为是预期的。好的,不是预期的,但可以解释由于浮点数的工作原理。看看http://floating-point-gui.de/如果链接有一天消失,谷歌&#34;程序员应该了解浮点数&#34; - 我确定它会被缓存到某个地方!

答案 2 :(得分:3)

而不是

for (t = 0; t <= tmax; t += dt) { /*do something*/ }

写:

double i;
for (i = 0; i <= 1000; i += 1.0) { 
  t = i / 10.0;
  /*do something */
}

使用此模式,循环体将完全执行1001次,t的每个值将是您想要的数字的最接近double近似值(特别是,第11个值将为1确切地说,第31个值将完全是3,...)。

您的版本无效,因为简单的十进制数(如0.1或0.01)无法在二进制浮点中完全表示。

如果你愿意使用二进制浮点来调整点数,只需使用2的幂就可以了:

for (t = 0; t <= 100.0; t += 1.0 / 64.0) { /*do something*/ }