为什么IEEE754标准中的除零导致无限值?

时间:2013-02-04 07:17:44

标签: language-agnostic floating-point ieee-754

我只是好奇,为什么在IEEE-754中任何非零浮点数除以零会产生无限值?从数学角度来看,这是无稽之谈。所以我认为这个操作的正确结果是NaN。

如果x是实数,则当x = 0时,不定义函数f(x)= 1 / x。例如,如果IEEE-754生成NaN值,则不为任何负数和sqrt(-1.0f)定义函数sqrt。但是1.0f / 0是Inf

但由于某种原因,IEEE-754并非如此。必须有一个原因,可能是一些优化或兼容性原因。

那有什么意义呢?

4 个答案:

答案 0 :(得分:53)

  

从数学的角度来看,这是无稽之谈。

是。不,排序。

事情是:浮点数是近似值。您希望使用各种指数和有限数量的数字,并获得并非完全错误的结果。 :)

IEEE-754背后的理念是每个操作都可以触发“陷阱”,指出可能出现的问题。他们是

  • 非法(无意义的操作,如负数的sqrt)
  • 溢出(太大)
  • 下溢(太小)
  • 除以零(你不喜欢的东西)
  • 不精确(此操作可能会给您错误的结果,因为您正在失去精确度)

现在很多像科学家和工程师一样的人都不想为编写陷阱例程而烦恼。因此,IEEE-754的发明者Kahan决定,如果不存在陷阱例程,每个操作也应该返回合理的默认值。

他们是

  • NaN for illegal values
  • 签署了溢出无限期
  • 为Underflow签名的零
  • NaN表示不确定结果(0/0)和无穷大(x / 0 x!= 0)
  • 不精确的正常操作结果

事实是,在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的限制。这里有两个很有趣的案例:

  1. 如果f(0) != 0,则x->0的限制为正或负无穷大,或者未定义。如果g(x)x==0附近采用两个符号,则限制未定义(左右限制不一致)。但是,如果g(x)只有一个符号接近0,那么将定义限制,无论是正无穷大还是负无穷大。稍后会详细介绍。
  2. 如果f(0) == 0,则限制可以是任何值,包括正无穷大,负无穷大,有限数或未定义。
  3. 在第二种情况下,一般来说,你根本不能说什么。可以说,在第二种情况下,NaN是唯一可行的答案。

    现在在第一种情况下,为什么选择一个特定的符号,或者可能是未定义的?实际上,如果您对分母的符号有所了解,那么它会为您提供更大的灵活性,在您不这样做的情况下,成本相对较低。例如,您可能有一个公式,您可以通过分析方式了解所有g(x) >= 0的{​​{1}},例如x。在这种情况下,限制被定义,并且它是无穷大,符号等于g(x) = x*x的符号。您可能希望利用它作为代码的便利。在其他情况下,如果您对f(0)的符号一无所知,则通常无法利用它,但这里的成本仅仅是您需要捕获一些额外的情况 - 正无穷大 - 除了g之外,如果您想完全错误检查您的代码。那里有一些价格,但与其他情况下获得的灵活性相比并不大。

    当问题是关于“简单划分”时,为什么要担心一般功能?一个常见的原因是,如果您通过其他算术运算计算分子和分母,则会累积舍入误差。这些错误的存在可以抽象为上面显示的通用公式格式。例如NaN,其中f(x) = x + e是分析正确的答案,x表示来自舍入的错误,而e是您实际拥有的浮点数在执行机器上。