为什么我所有的双精度计算都在循环中给出相同的结果



我在做这个问题时遇到了一些麻烦:

您的第一个程序是一个简单的数学计算程序。该程序将接受用户的输入。评估 f(x( 并在表格中显示结果。来自用户的输入将是:两个double xminxmax。符号常量(POINTS(用于确定表中的行数。方程是两个余弦函数的总和;

f(x( = 0.0572 cos(4.667 x( + 0.0218 π cos(12.22 x(; [等式1]

提示:

  • 您可以在计算中使用<cmath>中找到的函数cos
  • π的值是一个命名常量,其值为 3.1416;

方法:

  1. 定义一个符号常量 (POINTS( 将行数设置为 20,
  2. 向用户询问 xminxmax 的值;
  3. 使用上面的三个值(POINTSxminxmax(计算x增量的值;
  4. 使用公式 1 计算 f(x( 的值;
  5. 显示具有以下格式的表格:

假设 POINTS 的值为 21,并且用户输入 xmin = −2 和 xmax = 2;然后程序应显示如下表:

X-Value   |   Y-Value
__________|__________
 -2           -0.0043
 -1.8         -0.0982
 -1.6         +0.0378
 -1.4         +0.0438
 -1.2         +0.0099
 -1           +0.0618
 -0.8         -0.1118
 -0.6         -0.0198
 -0.4         -0.0047
 -0.2         -0.0184
 0            +0.1257
 0.2          -0.0184
 0.4          -0.0047
 0.6          -0.0198
 0.8          -0.1118
 1             0.0618
 1.2           0.0099
 1.4           0.0438
 1.6           0.0738
 1.8          -0.0982
 2            -0.0043
─────────────────────

到目前为止,我得到了第 1 到 4 部分,但我正在为第 5 部分而苦苦挣扎。这是我的代码。

#include <iostream>
#include <string>
#include <cmath>
#define pi 3.1416
#define POINTS 20
using namespace std;
int main()
{
    int Xmin, Xmax;
    int step;
    cout << "Enter a value for xMin and xMax:n";
    cin >> Xmin >> Xmax;
    double x, y;
    step = (Xmax - Xmin) / POINTS;
    cout << "X-VALUES " << "" << "| " << "" << "Y-VALUES" << endl;
    cout << "_________" << "" << "|_" << "" << "_________" << endl;
    for (int i = 0; i < POINTS; ++i) 
    {
        x = Xmin + (step * i);
        y = 0.0572 * cos(4.667 * x) + 0.0218 * pi * cos(12.22 * x);

        cout << x << "t " << y << endl;
    }
    cout << "____________________" << endl;
    return 0;
}

它执行所有操作,除了它不打印正确的值。 这是它从我的代码中打印的内容:

Enter a value for xMin and xMax:
-2
2
    X-Value   |   Y-Value
    __________|__________
     -2           -0.0043
     -2           -0.0043
     -2           -0.0043
     -2           -0.0043
     -2           -0.0043
     -2           -0.0043
     -2           -0.0043
     -2           -0.0043
     -2           -0.0043
     -2           -0.0043
     -2           -0.0043
     -2           -0.0043
     -2           -0.0043
     -2           -0.0043
     -2           -0.0043
     -2           -0.0043
     -2           -0.0043
     -2           -0.0043
     -2           -0.0043
     -2           -0.0043
     -2           -0.0043
    ─────────────────────

我不知道我做错了什么。我无法获得与第 5 部分中顶部的表格完全相同的值。它只是重复了20次。i递增 1,所以当程序输出xy时,我不应该在下一个增量中看到值变化吗?帮帮我,我太困惑了。

您在整数除法和类型精度方面存在一些问题。

  1. 显然,您不想使用double精度上下文应用step,因此step本身应声明为double类型:

    double step = .0;
    
  2. 表达式(Xmax - Xmin) / POINTS缺少整数除法,无法提供范围+-]0-1.0[中的值。为了克服整数除法问题,至少将一个操作数转换为double

    double step = (double)(Xmax - Xmin) / POINTS;
    

现场演示

首先,使用初始化,而不是声明一个没有值的变量,然后为其赋值。因此,例如,删除double x, y;并更改以下两行:

x = Xmin + (step * i);
y = 0.0572 * cos(4.667 * x) + 0.0218 * pi * cos(12.22 * x);

对这些:

double x = Xmin + (step * i);
double y = 0.0572 * cos(4.667 * x) + 0.0218 * pi * cos(12.22 * x);

这样可以更轻松地查看此类表达式中涉及哪些类型。

现在对变量 step 执行相同的操作。如果在执行此操作时问题不是很明显,请添加一个显示 step 值的输出语句。

最新更新