47

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

如果 x 是实数,则当 x=0 时未定义函数 f(x) = 1/x。例如,函数 sqrt 没有为任何负数定义,如果 sqrt(-1.0f)IEEE-754产生一个NaN值。但是 1.0f/0 是Inf.

但由于某种原因,在IEEE-754. 这肯定是有原因的,可能是一些优化或兼容性的原因。

那么有什么意义呢?

4

4 回答 4

64

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

是的。不,有点。

问题是:浮点数是近似值。您想使用范围广泛的指数和有限的位数,并获得并非完全错误的结果。:)

IEEE-754 背后的想法是,每个操作都可能触发指示可能存在问题的“陷阱”。他们是

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

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

他们是

  • NaN 表示非法值
  • 为溢出签名无穷大
  • 下溢的有符号零
  • 不确定结果 (0/0) 的 NaN 和 (x/0 x != 0) 的无穷大
  • Inexact 的正常运行结果

问题是,在 99% 的情况下,零是由下溢引起的,因此在 99% 的情况下,Infinity 是“正确的”,即使从数学角度来看是错误的。

于 2013-02-04T10:09:39.897 回答
10

我不知道你为什么会认为这是胡说八道。

的简单定义a / b,至少对于非零而言,是在达到零之前必须减去b的唯一数量的s。ba

将其扩展到b可以为零的情况,必须从任何非零数字中减去才能达到零的数字确实是无限的,因为你永远不会达到零。

另一种看待它的方式是从限制的角度来讨论。当正数n接近零时,表达式1 / n接近“无穷大”。你会注意到我引用了这个词,因为我坚信不传播无限实际上是一个具体数字的错觉:-)

NaN保留用于数字不能由任何其他值(包括无穷大)表示(甚至近似)的情况,它被认为与所有其他值不同。

例如,0 / 0(使用我们上面的简单定义)可以减去任意数量的s以达到 0。因此结果是不确定的 - 它可以是 1、7、42、3.14159 或任何其他值。ba

类似地,负数的平方根之类的东西在 IEEE754 使用的实平面中没有值(您必须为此使用复平面),无法表示。

于 2013-02-04T07:22:54.713 回答
8

在数学中,除以零是未定义的,因为零没有符号,因此两个结果同样可能且互斥:负无穷大或正无穷大(但不能两者兼有)。

在(大多数)计算中,0.0 有符号。因此,我们知道我们从哪个方向接近,以及无穷大将有什么符号。当 0.0 表示一个非零值太小而无法由系统表示时尤其如此,因为它经常出现这种情况。

唯一适合 NaN 的情况是系统确定分母确实是零。除非有一种特殊的方法来指定它,否则它不能这样做,这会增加开销。

于 2017-06-14T06:00:50.243 回答
0

注意:我根据@Cubic 的宝贵评论重新写了这篇文章。

我认为这个问题的正确答案必须来自微积分和极限的概念。在 假设 下考虑f(x)/g(x)as的极限。这里有两个有趣的广泛案例:x->0g(0) == 0

  1. 如果f(0) != 0,则限制 asx->0是正无穷大或负无穷大,或者它是未定义的。如果g(x)在 附近取两个符号x==0,则极限未定义(左右极限不一致)。但是,如果g(x)在 0 附近只有一个符号,则限制将被定义为正无穷或负无穷。稍后再谈。
  2. 如果f(0) == 0也是如此,那么限制可以是任何东西,包括正无穷大、负无穷大、有限数或未定义。

在第二种情况下,一般来说,你根本不能说什么。可以说,在第二种情况下NaN是唯一可行的答案。

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

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

于 2017-05-15T16:14:37.647 回答