IEEE 754单精度浮点数相加时2^(-50)被忽略的原因求解
为什么
b + c结果为-1的原因解答 32位IEEE 754单精度浮点数的有效数字部分为24位二进制(1位隐式前导1 + 23位显式存储的尾数),仅能精确表示最高位与最低位差值不超过23个二进制位的数值,这是核心原因。
浮点数相加需要先执行对阶操作,规则为小指数向大指数对齐,将指数更小的数的尾数右移对应位数,待两个数指数一致后再做加法:
b = -1对应的IEEE 754表示为1.0 * 2^0,指数为0c = pow(2, -50)对应的表示为1.0 * 2^-50,指数为-50
对阶时需要把c的尾数右移 0 - (-50) = 50 位,才能让它的指数和b保持一致。但单精度浮点数只有23位显式尾数存储空间,右移50位后,c的所有有效二进制位都会被完全移出尾数的存储范围,对阶后的c值等价于0。
因此-1 + 2^-50经过对阶后实际运算等价于-1 + 0,最终得到结果-1。
你可以简单验证:单精度浮点数下,和±1相加不会被舍入丢弃的最小正数为2^-23(约1.19e-7),只要小于该阈值的正数和±1相加,都会因为有效位在对阶时被全部移出而被丢弃,你用到的2^-50远小于该阈值,自然会被舍掉。
内容的提问来源于stack exchange,提问作者Zacryon
相关产品推荐
相关产品推荐

