奇怪的C ++浮动bug

时间:2013-07-05 18:38:46

标签: c++ floating-point

#include <iostream>
using namespace std;

int main()
{
    cout.precision(32);

    float val = 268433072;
    float add = 13.5;

    cout << "result =" << (val + add) << endl;
}

我正在用标准g++ main.cc编译上述程序 并使用./a.out

运行它

然而,我收到的输出是, result =268433088

显然,这不是正确答案。为什么会发生这种情况?

编辑:使用double代替float

时不会发生这种情况

2 个答案:

答案 0 :(得分:8)

您可以使用更简单的代码重现“浮动错误”

#include <iostream>
using namespace std;

int main()
{
    cout.precision(32);
    float val = 2684330722;
    cout << "result =" << val << endl;
}

输出

result =2684330752

正如您所看到的,输出与初始化的值val不匹配。

正如多次说明的那样,浮点类型的精度有限。您的代码示例只是超出了该精度,因此结果得到了舍入。这里没有“错误”。

答案 1 :(得分:1)

除了对(1991, PDF) What Every Computer Scientist Should Know About Floating-Point Arithmetic

的引用

简短的回答是,因为 float 具有有限的存储(与其他原语一样),工程师必须做出选择:存储哪些数字具有哪种精度。对于浮点格式,他们决定精确地存储小幅度的数字(一些十进制数字),但大幅度的数字非常不精确,实际上从+ -16,777,217开始可表示的数字变得如此之薄以至于甚至没有表示所有整数这是你注意到的事情。