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