Language agnostic 为什么在IEEE754标准中被零除会产生无穷大的值?

Language agnostic 为什么在IEEE754标准中被零除会产生无穷大的值?,language-agnostic,floating-point,ieee-754,Language Agnostic,Floating Point,Ieee 754,我只是好奇,为什么在IEEE-754中,任何非零浮点数除以零都会产生无穷大的值?从数学角度看,这是胡说八道。所以我认为这个操作的正确结果是NaN 如果x是实数,当x=0时,函数f(x)=1/x未定义。例如,如果IEEE-754产生一个NaN值,则函数sqrt没有为任何负数定义,而sqrt(-1.0f)。但是1.0f/0是Inf 但由于某些原因,IEEE-754中的情况并非如此。这肯定是有原因的,可能是一些优化或兼容性的原因 那有什么意义呢?我不知道你为什么会认为这是胡说八道 a/b的简单定义,至

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

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

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


那有什么意义呢?

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

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

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

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

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

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

类似地,负数的平方根在IEEE754使用的实平面中没有值(必须转到复平面),无法表示

从数学角度看,这是胡说八道

对。不,有点

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

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

  • 非法(无意义的操作,如负数的sqrt)
  • 溢出(太大)
  • 底流(太小)
  • 除以零(你不喜欢的东西)
  • 不精确(此操作可能会给您错误的结果,因为您正在失去精度)
现在许多像科学家和工程师这样的人不想为编写陷阱例程而烦恼。因此,IEEE-754的发明者Kahan决定,如果不存在陷阱例程,则每个操作也应返回一个合理的默认值

是的

  • NaN用于非法值
  • 溢出符号无穷大
  • 底流的符号零
  • 对于不确定结果(0/0)为NaN,对于(x/0 x!=0)为无穷大
  • 不精确的正常操作结果
问题是在99%的情况下,零是由底流引起的,因此在99%的情况下 在任何时候,即使从数学角度看是错的,无限也是“正确的”。

注意: 我在@Cubic发表了一条有价值的评论后重新撰写了这篇文章

我认为正确的答案必须来自微积分和极限的概念。在<代码> g(0)=0</COD>的假设下,考虑<代码> f(x)/g(x)< /代码>为<代码> x>0 < /代码>。这里有两个有趣的大案例:

  • 如果
    f(0)!=0
    ,则限制为
    x->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