FLT_MAX
有一点模式01111111011111111111111111111111
。
如果我理解正确,这样的位模式应该表示1.111...1 * 2^128
(小数点后有 23 个 1)。然而, 的实际值FLT_MAX
只是1.0 * 2^128
。这里发生了什么?
FLT_MAX
有一点模式01111111011111111111111111111111
。
如果我理解正确,这样的位模式应该表示1.111...1 * 2^128
(小数点后有 23 个 1)。然而, 的实际值FLT_MAX
只是1.0 * 2^128
。这里发生了什么?
你的指数是错误的,它是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
您可以在第八位看到差异。