索引运行错误的间隔

时间:2015-03-24 16:01:55

标签: c++ indexing

我无法弄清楚为什么会这样。 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;
    }

3 个答案:

答案 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的数字,因此并非所有内容都可以很容易地表示。

而不是执行浮点运算(假设ngridint),将它乘以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整数将产品舍入到较低的整数。