2

我对 C++ 还是很陌生,现在我正在学校学习它的介绍课程。本周的任务之一是解一个相当长的方程。所以我所做的就是把它分解成小块。当我尝试使用 sin 函数时,我得到了奇怪的输出,所以我开始弄乱了一点并将它隔离到这个......

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    double input1, input2, a;
    cout << "Enter first input." << endl;
    cin >> input1;
    cout << "Enter second input." <<endl;
    cin >> input2;

    a = input2 - input1*2;
    cout << a << endl; // This doesn't give expected output
    cout << input2 - 2*input1 <<endl; //This gives the expected result
    return 0;
}

作为返回值,我得到了一个非常小的数字:6.95323e-310. 显而易见的问题是,为什么?

如果它有帮助,我正在使用 g++ 4.2 的 Mac OS 上执行此操作。

我的输入值是 5 和 2...所以我希望-8.

谢谢。

4

1 回答 1

1

您发布的代码在各种编译器下对我来说都很好,但是我建议进行一些改进:

cout << input2 - 2*input1 <<endl;我会将其更改为cout << input2 - (2*input1) <<endl;

我还将确保 cin 在使用输入之前完全清楚:以下修改后的代码:

cout << "Enter first input." << endl;
cin.clear();
cin >> input1;
cout << "Enter second input." <<endl;
cin.clear();
cin >> input2;

我只有一次偶然成功地复制了您的错误,并且由于输入设置不正确而发生错误。

之后,我逐步执行了几次程序并检查了输出:当变量设置不正确时(即它们包含变量使用的内存位置发生的任何值),我始终得到与您发布的答案相似的答案。

所以简单的答案是变量未初始化,因为 cin 缓冲区未清除。

希望这会有所帮助,如果您需要更好/更深入的解释,请告诉我:)

附录:

我在阅读其他评论时想到的还有几点:

using namespace std; - 这适用于您完全控制的小型项目,即家庭作业、小型作业等。但是,当您使用不同的代码(其他库、API 等)时,更建议直接控制命名空间:它们的存在是为了让您针对特定的给定命名空间内的功能,并避免代码中的名称争用/歧义。例如,您现在可能会调用 cin,但稍后您可能会在代码中包含另一个 API,我们将其称为 TEST 命名空间,因此您添加using namespace TEST; TEST 包含它自己的 cin 实现,它自动处理 cin 清除(很方便,因为这可以解决您的问题)但是您的代码现在无法编译,因为您拥有std::cin并且TEST::cin两者都可用,并且因为您在键入 cin 时对两者都使用了 using 命名空间可能是。

还有一个建议是使用浮点数而不是双精度数,这有几点:

  • 使用 float 或 double 将允许十进制值 = TRUE
  • 使用浮点数而不是双精度数将解决您的问题= 非常罕见 确实,在有限的情况下,浮点数的位大小将解决双精度位大小引起的问题。
  • 一般编程约定:为了内存效率,使用可以包含所有用例值的最小可能类型(双精度名义上是内存中浮点大小的两倍,因此0.3f是内存使用量的一半0.3d

我知道这是做作业的,正如您提到的,这就是我添加额外信息的原因:获得更多信息总是好的,无论您是否同意,都可以让您进行更深入的研究并同意/证明或不同意/反驳您拥有的初始信息。欢迎编程,顺便说一句,它只会变得更糟!

更好的!我的意思更好!

于 2013-10-25T08:29:03.163 回答