为什么IEEE 754标准使用127偏差?

时间:2012-01-18 12:07:40

标签: floating-point

当使用整数的过量表示时,我使用2 n-1 的偏差。但是,IEEE 754标准使用2 n-1 - 1。

我能想到的唯一好处是更积极的范围。是否有任何其他原因可以作出决定?

1 个答案:

答案 0 :(得分:9)

原因是Infinities / NaNs和逐渐下溢。

如果使用指数显示整数(n> = 0)和小数(n <0)值,则问题是你需要一个指数为2 ^ 0 = 1.所以剩下的范围是奇数,为您提供选择更大范围的分数或整数的选择。 对于单精度,我们有256个值,255没有0指数。 现在IEEE754为特殊值保留了最高指数(255):+ - 无穷大和NaNs(非数字)表示失败。所以我们再次回到偶数(双方254,整数和小数),但偏差较小。

第二个原因是逐渐下溢。标准声明通常所有数字都被标准化,这意味着指数表示第一位的位置。为了增加位数,通常不设置第一位但假设(隐藏位):指数位后的第一位是数字的第二位,第一位始终为二进制1。 如果强制执行标准化,则会遇到无法编码为零的问题,即使将零编码为特殊值,数值精度也会受到阻碍。 + -Infinity(最高指数)清楚地表明出现了问题,但是对于数量太小而导致零下溢是完全正常的,因此容易被忽视作为可能的问题。因此,该标准的设计者Kahan决定引入非规范化数字或次正规数,它们应包括1 / MAX_FLOAT。

编辑:如果你将零编码为特殊值,艾伦就会问为什么“数值精度会受到阻碍”。我应该更好地将其称为“数值准确度仍然受阻”。实际上这是历史DEC VAX浮点格式的实现。如果原始位编码中的指数字段为0,则将其视为零。例如,我现在认为32位格式仍然在GPU中猖獗。

X 00000000 XXXXXXXXXXXXXXXXXXXXXXX

在这种情况下,右边的尾数字段的内容可以完全忽略,并且通常用零填充。左侧的符号字段可能有效,区分正常零和“负零”(您可以通过-1.0 / 0.0或舍入负数得到负零)。

相比之下,IEEE 754的逐渐下溢和次正常确实使用了尾数字段。只有

X 00000000 00000000000000000000000

为零。所有其他位组合都是有效的,甚至更实用,如果结果下溢,则会收到警告。 那么重点是什么?

考虑不同的数字

A 0 00000009 10010101111001111111111  
B 0 00000009 10010101111100001010000

它们是有效的浮点成员,非常小但仍然有限。但是你看到前11位是相同的。如果现在减去A-B或B-A,则第一个有效位离开较低的指数范围,因此没有逐渐下溢的结果是.... 0。 所以A!= B但是A-B = 0。无数人陷入了这个陷阱,可以假设他们从未认识到它。乘法或除法相同:你需要加上或减去指数,如果它低于下限阈值:0。如你所知:0 *所有= 0.你可以有S T X < em> Y Z并且一旦一个子产品为0,即使完全有效且甚至很大的数字是正确的结果,结果也是0。应该说,由于四舍五入,这些异常可能永远不会完全避免,但随着逐渐下溢,它们变得罕见。非常罕见。