IEEE浮点表示中1.0/3.0*3.0为何精确等于1?
为什么
1.0 / 3.0 * 3.0的结果是1.0? 首先明确:IEEE 754浮点数的默认舍入规则是向最近的可表示值舍入,若结果恰好落在两个可表示值的中间,则选择尾数为偶数的那个。
我们一步步拆解:
1.0 / 3.0得到的浮点数x确实是略小于真实值1/3的近似值,但这个近似值和1/3的误差极小——以双精度浮点数为例,误差不超过2^-55(远小于2^-53,这是1.0和相邻更小可表示浮点数的差值)。- 计算
x * 3.0时,结果是1 - 3*误差,这个值会落在1.0和**比1.0小的最大可表示浮点数(即1 - 2^-53)**之间。 - 由于
3*误差 < 2^-53,所以x*3距离1.0的距离比距离1 - 2^-53的距离更近,根据舍入规则,会被舍入为1.0。
你之前误以为乘法不会产生舍入,其实是忽略了这个误差的量级:x*3的结果并没有到达“尾数全1”的那个浮点数,而是更靠近1.0,因此触发了舍入到1.0的规则。
内容的提问来源于stack exchange,提问作者Masquue
相关产品推荐
相关产品推荐

