当 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
这是一个简单的 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