FLT_MAX
的位模式为01111111011111111111111111111111
。
如果我理解正确,这样的位模式应该代表1.111...1 * 2^128
(十进制后的二十三个1)。但是,FLT_MAX
的实际值仅为1.0 * 2^128
。这是怎么回事?
答案 0 :(得分:3)
你的指数错了,它是1.111...1 * 2^127 = 2^128 - 2^104
。这与2^128
非常接近(相对),你需要在C或C ++中以超过默认精度打印出来以查看差异(注意,作为float
- 如果是IEEE754 32位float
- 2^128
是无穷大,因此您需要double
)。
位模式产生
0 11111110 11111111111111111111111
^ ^ ^
sign exponent mantissa
254-127 2 - 2^(-23)
打印完整值:
340282346638528859811704183484516925440.0 // FLT_MAX
340282366920938463463374607431768211456.0 // 2^128
你可以看到第八位的差异。