IEEE-754尾数超23位的处理逻辑:-673.4末尾为何是10而非01?
关于IEEE-754中-673.4尾数末尾变化的解释
核心原因:IEEE-754默认舍入规则(舍入到最近值,偶数优先)
你的推导只差最后一步:当尾数有效位超过23位时,需要遵循IEEE-754的默认舍入模式——舍入到最近的可表示值,若恰好处于两个值的中间,则选择最后一位为偶数的那个值。
具体推导过程
- 先确认-673.4的二进制展开:
整数部分673的二进制是1010100001,小数部分0.4是无限循环二进制0.(0110),完整二进制为:1010100001.01100110011001100110011001100110... - 归一化处理(IEEE-754单精度要求尾数为
1.xxxx形式):
移动小数点9位到第一个1后,得到1.01010000101100110011001100110... × 2^9,因此指数为9 + 127 = 136(二进制10001000),符号位为1(负数)。 - 尾数截断与舍入:
单精度尾数仅保留小数点后23位,原展开的小数点后序列是:01010000101100110011001 1001100110...
这里第23位是1,后面跟着的100110...是非0序列,说明当前值介于两个可表示值之间:- 截断到23位的尾数:
01010000101100110011001(最后一位为1,奇数) - 进1后的尾数:
01010000101100110011010(最后一位为0,偶数)
根据舍入规则,原数更接近进1后的结果,且进1后的尾数最后一位是偶数,因此最终选择后者。
- 截断到23位的尾数:
背后的算法与判断时机
- 判断时机:当尾数有效位长度超过23位(单精度)或52位(双精度)时触发舍入。
- 具体算法(默认模式):
- 观察截断位置后的第一位(即第24位):
- 若该位为0:直接截断,保留前23位。
- 若该位为1且后面还有非0位:进1。
- 若该位为1且后面全为0(恰好处于两个值中间):看第23位,若为奇数则进1(变为偶数),若为偶数则直接截断。
- 观察截断位置后的第一位(即第24位):
内容的提问来源于stack exchange,提问作者cooooool
相关产品推荐
相关产品推荐

