浮点循环运行的迭代次数应该比应有的多

时间:2013-11-15 13:11:44

标签: c

我有这个循环应该在y(范围[-1,1])上超过x(范围[-1,1])和lx次迭代ly次,总共9次,但它迭代了16次!这是为什么?

#include <stdio.h>

int main(void) {
  double lx=3,ly=3;
  double du = (1-(-1))/double(lx);
  double dv = (1-(-1))/double(ly);
  int count=0;

  for (double y=-1; y < 1; y += dv)
    for (double x=-1; x < 1; x += du) {

      count++;
    }

  printf("\n\n%d lss\n", count);
}

3 个答案:

答案 0 :(得分:3)

真的?

你正在迭代[-1,-1 / 3,1 / 3,1]。

你可以通过在循环中输入一个输出语句来看看发生了什么。

答案 1 :(得分:0)

我假设您的C实现使用IEEE {754 64位二进制浮点double,这是最常见的选择。

每个数值运算系统都是不精确的,所以你使用的数字与精确数学所得的数字不同。

声明double du = (1-(-1))/double(lx);du设置为最接近2/3的double值,即0.66666666666666662965923251249478198587894439697265625。

在外循环的第一次迭代中,y为-1。在每次迭代结束时向其添加du时,结果为:

  • -0.33333333333333337034076748750521801412105560302734375,
  • 0.3333333333333332593184650249895639717578887939453125,和
  • 0.99999999999999988897769753748434595763683319091796875。

显然,y的最后一个值小于1,所以循环继续进行另一次迭代。

循环迭代器通常应该使用整数值,因此很容易确保使用精确的算术。您可以缩放迭代器以生成其他所需的值:

for (int iy = 0; iy < 4; ++iy)
{
    double y = iy * 2 / 3. - 1;
    …
}

答案 2 :(得分:-1)

你需要在这里以不同的方式计算起点和终点之间的差异,因为你在这里使用双打。

所以不是end - start使用end - start + 1.0而是你已经完成了。