双精度浮点。为什么最大指数是 1023

Double precision floating point. Why is the maximum exponent 1023

提问人:Teodoras Paura 提问时间:11/1/2023 更新时间:11/1/2023 访问量:46

问:

当我们有一个二进制 Intel 处理器和一个由 64 位表示的双精度浮点数时,其中 1 位表示符号,52 位表示尾数,11 位表示指数。

我不明白为什么它不应该是 2^11,因为 11 位专用于它。e_max = 2^10 - 1 = 1023

如何由此得出结论,最小的表示浮点数约为 10^(-308),最大的浮点数为 10^(308)?

感谢您的任何澄清或解释!

浮点 二进制 双精度

评论


答:

1赞 chux - Reinstate Monica 11/1/2023 #1

...为什么 e_max = 2^10 - 1 = 1023 不应该是 2^11,因为 11 位专用于它。

不。考虑负指数。

使用 binary64 编码时,编码的数字具有偏置指数,即从 0 到 2047 的 11 位无符号整数。(0 和 2047 的偏置指数具有特殊含义。

应用偏移量 -1023 后,编码在 [-1023 ...1024](同样,端点具有额外的特殊含义。它编码非常大的值(如 10 308)和很小的值(如 10-308)。


binary64 编码的原始设计可以使用 11 位有符号整数作为指数,在某些有符号整数编码中,但这缺点。对于有偏差的指数,我们有优势:

  • 大约在那个时候,存在 2 补码、1s 补码和符号大小机器的有符号整数编码。选择这 3 个中的一个作为指数将不利于其他 2 个。

  • 如果我们将整个浮点编码视为符号大小整数,则将保留浮点值从最小到最大的顺序。

  • 所选偏置 (-1203) 提供的绝对值与大于 1.0 和小于 1.0 的绝对值大致相同。略微选择的偏差> 1.0 的绝对值多于< 1.0。这允许 1.0/max 表示为非零(某个次正常值)。它还允许 1.0/normal_values 不会溢出。使用 3 种流行的有符号整数编码之一不会提供这一点,除非它也有偏见。