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

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

本文关键字:0时 返回 程序 我的 for 循环 为什么      更新时间:2023-10-16

这是一个简单的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循环中表达"测试"条件的方式也有问题——这里的逗号运算符实际上会忽略表达式的第一部分:

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

为了安全起见,当您想要测试两个条件时,请使用&&运算符:

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

最后,您的实际问题:

当for循环中k=0时,似乎出现了一些问题。是的返回一个垃圾值。

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

请随时要求进一步澄清和/或解释。

由于增量为0.2时存在舍入误差,因此k值永远不会精确地为零——它会稍微偏离一点。看看每个计算机科学家都应该知道浮点