我只是好奇,为什么在IEEE-754
任何非零浮点数除以零都会产生无限值?从数学的角度来看,这是无稽之谈。所以我认为这个操作的正确结果是 NaN。
如果 x 是实数,则当 x=0 时未定义函数 f(x) = 1/x。例如,函数 sqrt 没有为任何负数定义,如果 sqrt(-1.0f)IEEE-754
产生一个NaN
值。但是 1.0f/0 是Inf
.
但由于某种原因,在IEEE-754
. 这肯定是有原因的,可能是一些优化或兼容性的原因。
那么有什么意义呢?
我只是好奇,为什么在IEEE-754
任何非零浮点数除以零都会产生无限值?从数学的角度来看,这是无稽之谈。所以我认为这个操作的正确结果是 NaN。
如果 x 是实数,则当 x=0 时未定义函数 f(x) = 1/x。例如,函数 sqrt 没有为任何负数定义,如果 sqrt(-1.0f)IEEE-754
产生一个NaN
值。但是 1.0f/0 是Inf
.
但由于某种原因,在IEEE-754
. 这肯定是有原因的,可能是一些优化或兼容性的原因。
那么有什么意义呢?
从数学的角度来看,这是无稽之谈。
是的。不,有点。
问题是:浮点数是近似值。您想使用范围广泛的指数和有限的位数,并获得并非完全错误的结果。:)
IEEE-754 背后的想法是,每个操作都可能触发指示可能存在问题的“陷阱”。他们是
现在许多像科学家和工程师这样的人不想被编写陷阱例程所困扰。因此,IEEE-754 的发明者 Kahan 决定,如果不存在陷阱例程,每个操作也应该返回一个合理的默认值。
他们是
问题是,在 99% 的情况下,零是由下溢引起的,因此在 99% 的情况下,Infinity 是“正确的”,即使从数学角度来看是错误的。
我不知道你为什么会认为这是胡说八道。
的简单定义a / b
,至少对于非零而言,是在达到零之前必须减去b
的唯一数量的s。b
a
将其扩展到b
可以为零的情况,必须从任何非零数字中减去才能达到零的数字确实是无限的,因为你永远不会达到零。
另一种看待它的方式是从限制的角度来讨论。当正数n
接近零时,表达式1 / n
接近“无穷大”。你会注意到我引用了这个词,因为我坚信不传播无限实际上是一个具体数字的错觉:-)
NaN
保留用于数字不能由任何其他值(包括无穷大)表示(甚至近似)的情况,它被认为与所有其他值不同。
例如,0 / 0
(使用我们上面的简单定义)可以减去任意数量的s以达到 0。因此结果是不确定的 - 它可以是 1、7、42、3.14159 或任何其他值。b
a
类似地,负数的平方根之类的东西在 IEEE754 使用的实平面中没有值(您必须为此使用复平面),无法表示。
在数学中,除以零是未定义的,因为零没有符号,因此两个结果同样可能且互斥:负无穷大或正无穷大(但不能两者兼有)。
在(大多数)计算中,0.0 有符号。因此,我们知道我们从哪个方向接近,以及无穷大将有什么符号。当 0.0 表示一个非零值太小而无法由系统表示时尤其如此,因为它经常出现这种情况。
唯一适合 NaN 的情况是系统确定分母确实是零。除非有一种特殊的方法来指定它,否则它不能这样做,这会增加开销。
注意:我根据@Cubic 的宝贵评论重新写了这篇文章。
我认为这个问题的正确答案必须来自微积分和极限的概念。在 假设 下考虑f(x)/g(x)
as的极限。这里有两个有趣的广泛案例:x->0
g(0) == 0
f(0) != 0
,则限制 asx->0
是正无穷大或负无穷大,或者它是未定义的。如果g(x)
在 附近取两个符号x==0
,则极限未定义(左右极限不一致)。但是,如果g(x)
在 0 附近只有一个符号,则限制将被定义为正无穷或负无穷。稍后再谈。f(0) == 0
也是如此,那么限制可以是任何东西,包括正无穷大、负无穷大、有限数或未定义。在第二种情况下,一般来说,你根本不能说什么。可以说,在第二种情况下NaN
是唯一可行的答案。
现在在第一种情况下,为什么要在可能或未定义的情况下选择一个特定的符号?实际上,它在您确实了解分母符号的情况下为您提供了更大的灵活性,而在您不了解的情况下成本相对较低。例如,您可能有一个公式,您可以在其中分析地知道g(x) >= 0
对于所有x
,例如,g(x) = x*x
。在这种情况下,极限是定义的,它是无穷大,符号等于 的符号f(0)
。您可能希望在代码中利用它作为一种便利。在其他情况下,如果您对 的符号一无所知g
,您通常无法利用它,但这里的成本只是您需要捕获一些额外的情况 - 正无穷大和负无穷大 - 除了NaN
如果你想完全错误检查你的代码。那里有一些价格,但与其他情况下获得的灵活性相比,它并不大。
当问题是关于“简单除法”时,为什么要担心一般功能?一个常见的原因是,如果您通过其他算术运算计算分子和分母,则会累积舍入误差。这些错误的存在可以抽象为上面所示的通用公式格式。例如f(x) = x + e
,哪里x
是分析正确、准确的答案,e
代表四舍五入的误差,并且f(x)
是您在执行时机器上实际拥有的浮点数。