我无法弄清楚为什么会这样。 ngrid将是10的倍数。对于ngrid = 10说,当我打印出0.7 * ngrid时,我得到7,这当然是正确的。但是当我打印出来的时候,它打印出来的还有7和7& 8.为什么会这样?提前谢谢。
for(int i=(0.7*ngrid); i<0.8*ngrid; i++)
{
cout << i;
operator()(0.2*ngrid,i) = -3.0;
}
ngrid是int类型,在构造函数
中声明class Field
{
private:
double* data;
int n;
int index(int x, int y) const { return x + (n+1)*y; }
public:
Field(int ngrid) : n(ngrid)
{
data = new double[(ngrid+1)*(ngrid+1)];
int l=(ngrid+1)*(ngrid+1);
for (int i=0;i<l;i++) data[i]=0.0;
}
答案 0 :(得分:3)
你在这里做了一些危险的事情。首先,期望浮点运算的结果出现一个精确的整数。事实证明,即使ngrid
属于int
类型,在IEEE浮点格式中,0.7 不也是可表示的。您可以查看是否使用this page,0.7实际表示为0.699999988079071。乘以10,然后将其转换为int
,现在你有6个。
类似地,0.8表示为0.800000011920929。因此,当8与8.00000011920929进行比较时,它被正确地确定为更小,因此也打印了8。
因此,当您的for
循环开始执行时,i
初始化为6而不是7.这就是打印出6的原因。这个故事的寓意是,不要期望浮点运算很好地计算整数...即使你只处理一个小数位。计算机不能处理基数为10的数字,因此并非所有内容都可以很容易地表示。
而不是执行浮点运算(假设ngrid
是int
),将它乘以7然后除以7.这将执行整数运算而不是浮点运算。既然你说ngrid
总是10的倍数,结果应该总是一个整数,你不必担心截断。
答案 1 :(得分:0)
不要混合整数和浮点数/双打。 for
仅适用于数组索引或其他整数walktrhru。使用while
。
或者,使用fixpoint,将所有内容与100相乘。
编辑:当程序员在代码中找到for
时,他们认为,&#34;它是索引上的一种漫游,或整数坐标&#34;。如果你遇到这样的问题,比如当x * 0.7达到某个级别时突然出现循环,那么使用while
会更好,这意味着&#34;我们会重复一些事情,直到某些行为发生&#34;。有些语言甚至不允许在for
中使用非整数。
答案 2 :(得分:0)
我的谦虚意见:
将0.7 * ngrid更改为(7 * ngrid)/ 10和0.8 * ngrid更改为(8 * ngrid)/ 10
所以你只有整数
int i = 0.7 * ngrid将ngrid转换为float / double,因为0.7然后再次转换为int,因为我是delared整数将产品舍入到较低的整数。