fre*_*low 13 c c++ floating-point standards printf
#include <stdio.h>
#include <float.h>
int main()
{
printf("%f\n", FLT_MAX);
}
Run Code Online (Sandbox Code Playgroud)
GNU的输出:
340282346638528859811704183484516925440.000000
Run Code Online (Sandbox Code Playgroud)
Visual Studio的输出:
340282346638528860000000000000000000000.000000
Run Code Online (Sandbox Code Playgroud)
C和C++标准是否允许这两种结果?或者他们是否要求特定的结果?
请注意FLT_MAX = 2^128-2^104 = 340282346638528859811704183484516925440.
我认为C99标准的相关部分是7.19.6.1第13页的"推荐做法":
对于
e,E,f,F,g,和G转换,如果显著小数位数最多DECIMAL_DIG,那么结果应该进行正确舍入.如果有效十进制数的数量大于DECIMAL_DIG但是源值可以用DECIMAL_DIG数字精确表示,那么结果应该是具有尾随零的精确表示.否则,源值由两个相邻的十进制字符串L < U限定,两者都有DECIMAL_DIG有效数字; 结果十进制字符串D的值应满足L <= D <= U,并额外规定错误应具有当前舍入方向的正确符号.
我的印象是,这允许在这种情况下可能印刷的一些余地; 所以我的结论是VS和GCC都符合这里的要求.