我试图围绕二进制数的这种浮点表示来思考,但无论我在哪里看,我都找不到这个问题的好答案。
为什么指数有偏?
旧的可靠二进制补码方法有什么问题?
我试图查看维基百科关于该主题的文章,但它只说:“有符号值的通常表示方式会使比较变得更加困难。”
我试图围绕二进制数的这种浮点表示来思考,但无论我在哪里看,我都找不到这个问题的好答案。
为什么指数有偏?
旧的可靠二进制补码方法有什么问题?
我试图查看维基百科关于该主题的文章,但它只说:“有符号值的通常表示方式会使比较变得更加困难。”
IEEE 754 编码有一个方便的特性,即可以通过简单地按字典顺序比较相应的位串,或等效地,通过将这些位串解释为无符号整数并比较这些整数来在两个正的非 NaN 数之间执行顺序比较。这适用于从 +0.0 到 +Infinity 的整个浮点范围(然后扩展比较以考虑符号是一件简单的事情)。因此,例如在 IEEE 754 二进制 64 格式中,1.1
被编码为位串(msb 优先)
0011111111110001100110011001100110011001100110011001100110011010
while0.01
被编码为位串
0011111110000100011110101110000101000111101011100001010001111011
它按字典顺序出现在 . 的位字符串之前1.1
。
为此,具有较小指数的数字需要在具有较大指数的数字之前进行比较。一个有偏的指数使这项工作有效,而以二进制补码表示的指数会使比较更加复杂。我相信这就是维基百科评论适用的内容。
另一个观察结果是,通过选择的编码,浮点数+0.0
被编码为一个完全由零组成的位串。
我不记得具体细节了,但有些人希望最高指数比最低正态指数稍微远离零。这增加了 x 及其倒数都可以近似表示的值x的数量。例如,对于 IEEE-754 64 位二进制浮点,正常指数范围是 -1022 到 1023。这使得最大的有限可表示值刚好低于 2 1024,因此x及其倒数的区间都可以近似表示几乎是 2 -1024到几乎 2 1024。(此区间极低端的数字低于正常值,因此会丢失一些精度,但它们仍然可以表示。)
使用二进制补码表示,指数值的范围从 -1024 到 1023,我们必须保留其中两个来处理零、次正规、无穷大和 NaN。这留下了 -1023 到 1022 的范围。这样, x的区间使得x及其倒数都可以近似表示,几乎是 2 -1023到 2 1023。因此,偏置排列提供了更大的有用值范围。
相信这张图会帮助你理解马克·狄金森所说的simply comparing the corresponding bit strings lexicographically, or equivalently, by interpreting those bit strings as unsigned integers and comparing those integers.