当 for 循环中的 k == 0 时,为什么我的程序返回垃圾值?

Why is my program returning a garbage value when k == 0 in the for-loop?

这是一个简单的 C++ 程序,它使用公式计算 f(x),该公式用于 2 个给定数字之间的固定数量的值。

for循环中k = 0时似乎有问题。它正在返回一个垃圾值。

谁能告诉我为什么?

非常感谢任何帮助。提前致谢。

#include<iostream>
#include<iomanip>
#include<cmath>

using namespace std;

int main ()
{

  int const POINTS = 21;
  double const PI = 3.1416;
  double min, max, increment, dataPoints[21];

  cout << "Enter max value: ";
  cin >> max;

  cout << "Enter min value: ";
  cin >> min;

  increment = (max - min) / (POINTS - 1);


  cout << setw (20) << "X-Value" << "|";
  cout << setw (20) << "Y-Value" << endl;

  double k;
  int l;

  for (k = min, l = 0; l < POINTS, k <= max; l++, k += increment)
    {
      dataPoints[l] = (PI / 16) * sin (6.036 * k) + (1 / 64) * PI * cos (24.44 * k);
      cout << setw (20) << k << setw (20) << dataPoints[l] << endl;
    }

}

输出:

Enter max value: 4
Enter min value: -4
             X-Value|             Y-Value
                  -4            0.164018
                -3.6          -0.0507715
                -3.2          -0.0881608
                -2.8            0.182492
                -2.4           -0.184497
                  -2           0.0931637
                -1.6           0.0453027
                -1.2            -0.16085
                -0.8            0.195021
                -0.4           -0.130529
       -5.55112e-016       -6.57901e-016
                 0.4            0.130529
                 0.8           -0.195021
                 1.2             0.16085
                 1.6          -0.0453027
                   2          -0.0931637
                 2.4            0.184497
                 2.8           -0.182492
                 3.2           0.0881608
                 3.6           0.0507715
                   4           -0.164018

Process returned 0 (0x0)   execution time : 3.634 s
Press any key to continue.

一个问题出在代码(1 / 64) ... 因为你把这个表达式放在括号里了。因此,它是 整数 除法,因此 总是 具有 的值。

试试这个,而不是:

    dataPoints[l] = (PI / 16) * sin (6.036 * k) + (1.0 / 64) * PI * cos (24.44 * k);

您在 for 循环中表达 'test' 条件的方式也存在问题 - 这里的 comma operator 将有效地忽略表达式的第一部分:

for (k = min, l = 0; l < POINTS, k <= max; l++, k += increment)

为了安全,当你想要两个条件都被测试时,使用&&运算符:

for (k = min, l = 0; l < POINTS && k <= max; l++, k += increment) {

最后,您的实际问题:

There seems to be some problem when k = 0 in the for loop. It is returning a garbage value.

不,不是!您对 k 变量(即每个循环中的 k += increment)执行的浮点运算并不精确:您认为 0.4 + (-0.4) 实际上 'nearly' '0.4' - 'nearly' '0.4';因此,你得到的值(我的系统给出 -5.55112e-16)是一个 'reasonable approximation' 到零,给定你使用的数字范围(以及之前累积的 'errors'循环)。

随时要求进一步澄清and/or解释。

由于当您递增 0.2 时会出现舍入误差,您的 k 值永远不会完全为零——它会稍微偏离一点。参见 What every computer scientist should know about floating point