我有这个循环应该在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);
}
答案 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
时,结果为:
显然,y
的最后一个值小于1,所以循环继续进行另一次迭代。
循环迭代器通常应该使用整数值,因此很容易确保使用精确的算术。您可以缩放迭代器以生成其他所需的值:
for (int iy = 0; iy < 4; ++iy)
{
double y = iy * 2 / 3. - 1;
…
}
答案 2 :(得分:-1)
你需要在这里以不同的方式计算起点和终点之间的差异,因为你在这里使用双打。
所以不是end - start
使用end - start + 1.0
而是你已经完成了。