读戈德堡的《每个计算机科学家都应该知道的关于浮点算术的知识》,我发现了一些我不太理解的东西。
他指出,拥有非规范化数字是好的,因为x = y
当且仅当x-y==0
。然后他举了一个例子:
则 z = 1/(x-y(
现在,假设x-y
是一个非规范化的数字。那么1/(x-y)
很有可能会变得inf
.如果我们一开始没有非规范化数字,这是相同的结果。
甚至,如果我想执行除法,并避免inf
结果,那么如果我们没有非规范化数字,那就更方便了:
if (x-y) then z = 1/(x-y) // here, we know that z is not inf
我无法用非规范化数字实现相同的结果,因为x-y
可能不是零,而是一个非规范化的数字,然后1/(x-y)
除将导致inf
。所以,在这里,非规范化数字实际上会引起麻烦。
为什么当且仅当x-y=0
拥有x=y
是一个好属性?
当非规范化数字有用时?
William Kahan关于逐渐下溢的一些观点:
- 如果浮点格式具有次正规值,则可表示值之间的间隙不会随着数字的减少而增加。这在编写证明时很有帮助,因为可以断言,如果 x 0 与其最近邻之间的差值为 u,那么对于任何 x ≤x0,x与其最近邻之间的差值最多为u。然后你可以继续得出结论,只要输入在边界内,某些计算序列产生的误差最多是某个值。如果没有次正规值,则必须编写异常,其中考虑中间值溢出的情况,将证明分为多个情况,排除证明域的某些部分,等等。
- x ±y不能下溢,因为次正态差值是精确的。
- 只要至少有一个项是正态的,乘积总和从次正规项中受到的舍入误差较小。
该论文并没有声称逐渐下溢在每种情况下都优越,但事实证明总体上是可取的。
当你给出这个例子时:
if (x-y) then z = 1/(x-y) // here, we know that z is not inf
这限制了效用,因为它在if (x-y) then z = 4/(x-y)
中是不正确的。