浮点舍入错误

Ale*_*tov 5 c++ floating-point double ieee-754

我不明白以下程序的输出:

int main()
{
    float  x     = 14.567729f;
    float  sqr   = x * x;
    float  diff1 = sqr - x * x;
    double diff2 = double(sqr) - double(x) * double(x);
    std::cout << diff1 << std::endl;
    std::cout << diff2 << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

6.63225e-006
6.63225e-006
Run Code Online (Sandbox Code Playgroud)

我用的是VS2010,x86编译器.

我期望获得不同的输出

0
6.63225e-006
Run Code Online (Sandbox Code Playgroud)

为什么diff1不等于0?要计算sqr - x * x编译器,浮点精度会增加一倍.为什么?

Dav*_*men 2

float  diff1 = sqr - x * x;
double diff2 = double(sqr) - double(x) * double(x);
Run Code Online (Sandbox Code Playgroud)

为什么 diff1 不等于 0?

因为您已经缓存sqr = x*x并强制其表示为float.

为了计算 sqr - x * x,编译器将浮点精度增加到双倍。为什么?

因为在 C 标准出现之前,C 就是这样做的。我不认为现代编译器必须遵守该约定,但许多编译器仍然遵循它。diff1如果是这种情况,和的计算的右侧diff2将是相同的。唯一的区别是,在计算 的右侧之后float diff1 = ...,双精度结果将转换回浮点型。