为什么循环中的所有双精度计算都会得到相同的结果?

时间:2016-02-10 22:25:50

标签: c++ loops

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

  

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

     

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

     

提示:

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

方法:

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

    假设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时,我不应该看到下一个增量的值更改?帮助我,我很困惑。

2 个答案:

答案 0 :(得分:0)

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

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

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

    double step = (double)(Xmax - Xmin) / POINTS;
    
  3. Live Demo

答案 1 :(得分:-1)

首先,使用初始化,而不是声明没有值的变量,然后为其赋值。因此,例如,删除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值的输出语句。