关于语言不可知:为什么IEEE754标准中的除零导致无限值?

Why does division by zero in IEEE754 standard results in Infinite value?

我只是好奇,为什么在IEEE-754中,任何非零浮点数除以零都会产生无穷大的值?从数学的角度看,这是胡说八道。所以我认为这次手术的正确结果是NaN。

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

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

那有什么意义呢?


It's a nonsense from the mathematical perspective.

对。不。

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

IEEE-754背后的想法是,每一个操作都可能触发"陷阱",表明可能存在的问题。他们是

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

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

他们是

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

问题是,在所有情况下,99%的零是由下溢引起的,因此99%的零是由下溢引起的。在任何时候,无穷大都是"正确的",即使从数学的角度来看是错误的。


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

a / b的简单定义,至少对于非零的b来说,是b的唯一数字,在归零之前必须从a中减去。

把它推广到b可以为零的情况下,必须从任何非零数字中减去才能得到零的数字实际上是无限的,因为你永远不会得到零。

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

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

例如,0 / 0(使用上述简单的定义)可以从a中减去任何数量的b以达到0。因此,结果是不确定的——可能是1、7、42、3.14159或任何其他值。

类似地,负数的平方根在IEEE754使用的实平面中没有值(为此必须转到复平面),也不能表示。


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

在(大多数)计算中,0.0有一个符号。因此,我们知道我们正朝着什么方向靠近,无穷大会有什么符号。当0.0表示的非零值太小,系统无法表达时,尤其如此,因为这种情况经常发生。

唯一合适的时间是,如果系统确信分母是真正的,完全为零。除非有一种特殊的方法来指定它,否则它不能,这会增加开销。


注:我是在@cubic发表了一篇有价值的评论之后重新撰写这篇文章的。

我认为正确的答案必须来自微积分和极限的概念。在假设g(0) == 0的情况下,将f(x)/g(x)的极限视为x->0。这里有两个非常有趣的案例:

  • 如果是f(0) != 0,那么x->0的极限要么是正负无穷大,要么是未定义的。如果g(x)x==0附近同时出现两个标志,则该限值未定义(左右限值不一致)。但是,如果g(x)在0附近只有一个符号,则极限将被定义为正无穷大或负无穷大。以后再谈。
  • 如果f(0) == 0,那么极限可以是任何东西,包括正无穷大、负无穷大、有限数或未定义。
  • 在第二种情况下,一般来说,你什么都不能说。可以说,在第二种情况下,NaN是唯一可行的答案。

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

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