0

我正在运行一个带有一些 if 语句的简单 for 循环。在这个 for 循环中,将根据 for 循环中的索引值给 3 个变量赋值。看起来相当简单,但是,当我运行代码时,值总是为零,我不知道为什么会这样。下面提供了我的 for 循环。我很感激任何建议。

double A [N+1];
double r;
double s;
double v;
for(int i = 2; i < N+1; i++)
{
    if(i == 2)
    {
         r = 1/2/i/(i-1);
         s = -1/2/(i*i - 1);
         v = 1/4/i/(i+1);
    }
    else if(i <= N-2 && i > 2)
    {
        r = 1/4/i/(i-1);
        s = -1/2/(i*i - 1);
        v = 1/4/i/(i+1);
    }
    else if(i <= N-4 && i > N-2)
    {
        r = 1/4/i/(i-1);
        s = 0;
        v = 1/4/i/(i+1);
    }
    else
    {
        r = 1/4/i/(i-1);
        s = 0;
        v = 0;
    }

    A[i] = r*F[i-2] + s*F[i] + v*F[i+2];
    cout << r << s << v << endl;

}
4

5 回答 5

15

发生这种情况是因为您使用的是整数除法。一个例子:

r = 1/2/i/(i-1);

这与以下内容相同:

r = ((1 / 2) / i) / (i - 1);

这与以下内容相同:

r = (0 / i) / (i - 1);

......这与:

r = 0 / (i - 1);

……那是0

因为1 / 20整数算术。要解决此问题,请使用浮点值。

于 2012-12-04T12:27:20.263 回答
4

三件事:

  1. else if(i <= N-4 && i > N-2)没有意义,那个条件不能成立
  2. 您所有的除法都是整数除法 - 要修复,将其中一个数字转换为双精度数。
  3. 作为 1 的结果,当 i = N-1 且 i = N 时,将采用最后一个分支,您无论如何都将两个变量强制为 0!
于 2012-12-04T12:29:12.893 回答
2

1、2 和 4 是整数。在整数域 1/2 = 0 和 1/4 = 0

于 2012-12-04T12:27:46.927 回答
1

对于整数,1/2 为零。我建议(首先)将常量更改2为 into2.0以确保它们被视为双打。

您可能还希望(尽管可能没有必要)将所有i变量也转换为浮点值,只是为了完整性,例如:

r = 1.0 / 2.0 / (double)i / ((double)i - 1.0);

这是一个双精度的事实r绝不会影响在右侧完成的计算=。它只影响最后一位(实际分配)。

于 2012-12-04T12:28:59.660 回答
0

由于整数除法,1/2、1/4 和 -1/2 将始终为零。因此请尝试使用 1.0/2.0、1.0/4.0 和 -1.0/2.0 快速排序。但是要遵循基础知识,不要在代码中使用很多幻数。考虑为它们创建常量并使用 .

于 2012-12-04T12:31:02.450 回答