奇怪的编译器行为

时间:2016-05-05 02:16:37

标签: c++ floating-point g++

我在用g ++(4.6.3)编译一个小型C ++程序时遇到了一个奇怪的行为。比较两个浮点数并测试:

#include <iostream>
using namespace std;

int main () {
    float fahrenheit = 0;
    float celsius = 0;
    float test = 0;

    cout << "Temperature in °F: " << endl;
    cin >> fahrenheit;

    celsius = 5 / 9 * (fahrenheit - 32);
    test =  5 * (fahrenheit - 32) / 9;

    cout << "\nWrong:\t" << fahrenheit << " °F = " << celsius << " °C" << endl;
    cout << "Correct:" << fahrenheit << " °F = " << test << " °C" << endl;
}

我用&#34; g ++ test.cpp -o test&#34;。

编译了这个

这是该计划的输出:

$ ./test
Temperature in °F: 
1000

Wrong:  1000 °F = 0 °C
Correct:1000 °F = 537.778 °C

有人可以向我解释为什么g ++(可重复地)将摄氏度计算为0,而测试包含正确的解决方案吗?它是否与某些优化有关,虽然我没有为此设置任何参数?或者这在某种程度上确实是一个错误?

1 个答案:

答案 0 :(得分:2)

5 / 9 = 0

0 *任何= 0

当你除以整数时,你会得到一个整数。你可以说5.0 / 9它应该好多了。

当你编写代码并且没有得到你期望的东西时,你的第一个倾向应该是&#34;什么dod 做错了?&#34;不是&#34;编译器做错了什么?&#34;

它可以帮助你在大多数时间看到正确的地方。