为什么
printf("is 0.5 <= 0.49999999999999999 ? %s", 0.5 <= 0.49999999999999999 ? "true":"false" );
返回
is 0.5 <= 0.49999999999999999 ? true
*这不是一个功课,只是好奇。
答案 0 :(得分:4)
回答问题的最佳方法是稍微更改代码行:
printf("is %.16e <= %.16e ? %s", 0.5, 0.49999999999999999, 0.5 <= 0.49999999999999999 ? "true":"false" );
编译此行时,您会看到0.49999999999999999
四舍五入到最接近的可表示double
,这与0.5
相同(实际上代表的确切值为1/2) 。这解释了为什么一个低于或等于另一个:它们是同一事物的两种不同的符号。
注意:我选择了格式%.16e
,因为此格式具有永远不会为不同的双精度浮点数打印相同内容的属性。专家们更喜欢使用十六进制格式%a
。不仅十六进制更紧凑,而且使用它会立即明显表示0.5
被精确表示(它是0x0.8p0
或0x1.0p-1
)而其他一些十进制数字(例如0.1)不是(十六进制数字重复并用尽所有有效数字)。简而言之,使用十六进制输入和打印浮点数会立即让你成为专业人士。