Floating point 为什么我们要对浮点数的指数进行偏移?

Floating point 为什么我们要对浮点数的指数进行偏移?,floating-point,ieee-754,exponent,Floating Point,Ieee 754,Exponent,我试图用二进制数的浮点表示法来概括我的想法,但无论我在哪里寻找,我都找不到这个问题的好答案 为什么指数有偏 好的可靠的二补法有什么问题 我试着看维基百科关于这个主题的文章,但它只说:“符号值的通常表示形式会使比较更困难。”我不记得具体细节,但人们希望最高指数比最低正常指数稍微远离零。这增加了x及其倒数都近似可表示的值x的数量。例如,对于IEEE-754 64位二进制浮点,正常指数范围为-1022到1023。这使得最大有限可表示值刚好低于21024,因此x及其倒数都近似可表示的区间几乎为2-102

我试图用二进制数的浮点表示法来概括我的想法,但无论我在哪里寻找,我都找不到这个问题的好答案

为什么指数有偏

好的可靠的二补法有什么问题


我试着看维基百科关于这个主题的文章,但它只说:“符号值的通常表示形式会使比较更困难。”

我不记得具体细节,但人们希望最高指数比最低正常指数稍微远离零。这增加了x及其倒数都近似可表示的值x的数量。例如,对于IEEE-754 64位二进制浮点,正常指数范围为-1022到1023。这使得最大有限可表示值刚好低于21024,因此x及其倒数都近似可表示的区间几乎为2-1024到21024。(该区间最低端的数字低于正常值,因此会损失一些精度,但它们仍然可以表示。)


使用2的补码表示,指数值的范围是-1024到1023,我们必须保留其中的两个来处理零、次正常值、无穷大和NaN。剩下的范围是-1023到1022。这样,x的区间几乎为2-1023到21023,使得x及其倒数都近似可表示。因此,偏置排列提供了更大的有用值范围。

IEEE 754编码具有一个方便的特性,即可以通过简单地按字典顺序或等效地比较对应的位串,在两个非NaN正数之间执行顺序比较,通过将这些位字符串解释为无符号整数并比较这些整数。这适用于从+0.0到+无穷大的整个浮点范围(然后扩展比较以考虑符号是一件简单的事情)。因此,例如在IEEE 754二进制64格式中,
1.1
被编码为位字符串(msb优先)

0.01
被编码为位字符串

0011111110000100011110101110000101000111101011100001010001111011
它按字典顺序出现在
1.1
的位字符串之前

为了实现这一点,指数较小的数字需要在指数较大的数字之前进行比较。一个有偏差的指数可以使这一点起作用,而一个用二的补码表示的指数会使比较更加复杂。我相信这就是维基百科的评论所适用的

另一个观察结果是,使用所选的编码,浮点数
+0.0
被编码为完全由零组成的位字符串。

我相信这张图片将帮助您理解马克·迪金森(Mark Dickinson)所说的
,通过将这些位字符串解释为无符号整数并比较这些整数,简单地按字典或等效方式比较相应的位字符串。


在我看来,这个答案更多的是关于选择哪些值来表示,而不是关于位编码。对于指数字段(保留位模式
1000000000
100000000001
用于表示无穷大、NaN、零和次正常值),仍然可以使用2的补码而不是有偏差的指数,而不会影响可表示值集。@MarkDickinson:是,目标是选择要表示的值。偏见给了你选择的机会。偏差是一个可调参数;可以将其设置为提供所需的表示值集的值。这就是为什么它比2的补码更可取的原因,2的补码固定了编码的指数值。(玩要保留的值是一个难题,它会破坏所有位0表示零的属性,并破坏您在答案中注意到的排序属性。)同一篇文章说,两句话之后,“通过排列字段使符号位处于最高位位,中间有偏指数,然后在最低有效位中的尾数,得到的值将被正确地排序,无论它被解释为浮点还是整数值。这允许使用定点硬件对浮点数进行高速比较。”还可以查看是否有补码整型硬件,整个数字范围的排序是否正确
0011111110000100011110101110000101000111101011100001010001111011