【发布时间】:2012-12-06 20:06:46
【问题描述】:
可能重复:
Why “for( i = 0.1 ; i != 1.0 ; i += 0.1)” doesn’t break at i = 1.0?
我有一个数字(实数)区间 [x, y]。我必须使用类似的东西遍历它:
nr = 0;
for (i = x; i <= y; i += step) //step is a small double value
nr++;
对于步长为 0.001 的 [-1, 1],很明显 nr 应该是 2001(-1.000 ... 0.999 1.000),但是它计算出 nr = 2000(我进行了调查,但最后一次比较失败:0.999 + 0.001 > 1.000)
如何计算准确的 nr 值?
【问题讨论】:
-
float/double本质上是不精确的;如果您需要“精确”,请使用整数类型 -
您真的只想计算步数,还是循环体中的步数更多?里面会有什么?
-
nr 表示图像的高度,它映射在真实平面上。我在 for(s) 中计算了一些像素值。我知道精确计算 nr 是不可能的,所以我会坚持“height = (int) ((y - x) / step)。
-
@BoPersson:这个问题并没有问为什么总和不正确,就像你提出的重复一样。这个问题,如果从字面上看,询问如何准确计算 floor((y-x)/step)。
标签: c floating-point double precision