int i = 0;
double n = 1.24;
for (; int(n) != n; i++) {
n *= 10;
}
为什么会进入死循环?它不应该在两个循环后停止吗?
int i = 0;
double n = 1.24;
for (; int(n) != n; i++) {
n *= 10;
}
为什么会进入死循环?它不应该在两个循环后停止吗?
1.24
不能完全表示为 a double
。如果你检查 的初始值n
,你会发现它是1.239999999999999991118215802998747...
至于为什么循环永远不会停止,一旦n
超过最大值的值double
,它就会自动转换为+Infinity
,这是一个特殊的浮点值。一旦你达到了那个点,就n
停止改变,int(n) != n
永远不会满足。
因为 double 不是数字的精确表示,并且条件 int(n) == n 从未达到。阅读此http://en.wikipedia.org/wiki/Floating_point
我试过了,它在两个循环后停止。我用过gcc。我将 int(n) 更改为 (int)n
由于某些舍入误差而发生无限循环,请尝试检查 (int)n 和 n 之间的差异
通常,不要使用 equal 来检查 double 是否相等。改为使用
if (fabs(ab)<1e-10) //而不是 a==b