了解非规范化浮点数的用处
Understanding the usefulness of denormalized floating point numbers
阅读 Goldberg 的 What Every Computer Scientist Should Know About Floating-Point Arithmetic,我发现了一些我不太理解的东西。
他说非规范化数字很好,因为 x = y
当且仅当 x-y==0
。然后他举了个例子:
if (x != y) then 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 on gradual underflow的一些观点:
- 如果浮点格式具有次正规值,则可表示值之间的差距不会随着数字的减少而增加。这有助于编写证明,因为可以断言,如果 x0 与其最近的邻居之间的差异是 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)
中并非如此。
阅读 Goldberg 的 What Every Computer Scientist Should Know About Floating-Point Arithmetic,我发现了一些我不太理解的东西。
他说非规范化数字很好,因为 x = y
当且仅当 x-y==0
。然后他举了个例子:
if (x != y) then 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 on gradual underflow的一些观点:
- 如果浮点格式具有次正规值,则可表示值之间的差距不会随着数字的减少而增加。这有助于编写证明,因为可以断言,如果 x0 与其最近的邻居之间的差异是 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)
中并非如此。