我像这样迭代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
,则不执行最后一步。
我应该如何正确地迭代双打?
答案 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*/ }