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编译器,浮点精度会增加一倍.为什么?
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 = ...,双精度结果将转换回浮点型。