1

FLT_MAX有一点模式01111111011111111111111111111111

如果我理解正确,这样的位模式应该表示1.111...1 * 2^128(小数点后有 23 个 1)。然而, 的实际值FLT_MAX只是1.0 * 2^128。这里发生了什么?

4

1 回答 1

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

您可以在第八位看到差异。

于 2013-05-03T03:22:35.310 回答