Floating point 为什么无穷大×;0=NaN?

Floating point 为什么无穷大×;0=NaN?,floating-point,numbers,nan,ieee-754,infinity,Floating Point,Numbers,Nan,Ieee 754,Infinity,IEEE 754将1/0的结果指定为∞ (无穷大) 然而,IEEE 754随后指定了0×的结果∞ 作为南 这感觉有违直觉:为什么0是×∞ 不是0 我们可以想到1/0=∞ 当z趋于零时,1/z的极限 我们可以想到0×∞ = 当z趋于0时,0为0×z的极限∞. 为什么IEEE标准遵循直觉1。但不是2.?如果您不认为IEEE 754浮点零和无穷大实际上是零或无穷大,那么更容易理解它们的行为 浮点零不仅代表实数零。它们还表示所有实数,这些实数将舍入到比最小的次正常值更小的值。这就是为什么零是有符号的。即

IEEE 754将1/0的结果指定为∞ (无穷大)

然而,IEEE 754随后指定了0×的结果∞ 作为南

这感觉有违直觉:为什么0是×∞ 不是0

  • 我们可以想到1/0=∞ 当z趋于零时,1/z的极限

  • 我们可以想到0×∞ = 当z趋于0时,0为0×z的极限∞.


  • 为什么IEEE标准遵循直觉1。但不是2.?

    如果您不认为IEEE 754浮点零和无穷大实际上是零或无穷大,那么更容易理解它们的行为

    浮点零不仅代表实数零。它们还表示所有实数,这些实数将舍入到比最小的次正常值更小的值。这就是为什么零是有符号的。即使是很小的数字,如果它们实际上不是零,也会有符号

    类似地,每个无穷大也表示所有数字,其相应符号将四舍五入到某个大小不适合有限范围的数字

    NaN表示“无实数结果”,例如sqrt(-1),或“没有线索”

    非常大的东西除以非常小的东西是非常非常大的,所以‘Infinity/0==Infinity’

    非常大的东西乘以非常小的东西可以是任何东西,这取决于我们不知道的实际大小。因为结果可以是从非常小到非常大的任何东西,NaN是最合理的答案

    =================================================================

    虽然我认为以上是理解实际浮点行为的最佳方式,但在实数限制中也会出现类似的问题


    假设
    f(x)
    趋向于无穷大,而
    g(x)
    趋向于零,因为
    x
    趋向于无穷大。很容易证明
    f(x)/g(x)
    趋向于无穷大,因为
    x
    趋向于无穷大。另一方面,不可能证明关于
    f(x)*g(x)极限的任何东西
    没有关于函数的更多信息。

    因为无穷大不是一个具体的数字?但是在
    无穷大/0
    的情况下,被零除不优先于分子中发生的任何事情吗?(我在这里不是严格地论证数学。我只是猜测语言作者的意图。)Infinity在javascript中是一个数字,至少从类型上看是这样,但它并不是一个具体的数字,也不是,比如说,
    7
    或诸如此类的数字,它更像是一个概念,“最大的数字。”“等等,当你将无穷大与任何正数或负数相乘时,你会得到正无穷大或负无穷大,因为它不能再大了。当你把一个数字除以无穷大时,你会得到
    0
    ,因为它不能再小了。当你将无穷大与
    0相乘时,你会得到“不是一个数字”,因为有人认为这是合乎逻辑的事情,并将其放入规范中。为什么不将0*无穷大看作x*无穷大的极限,因为x趋于零?这和反过来一样有道理。0*无穷大的问题,以及它应该是NaN的原因,是可能出现0、无穷大以及介于两者之间的任何情况。因此,我们应该将0更多地视为一个非常小的量,而不是实际的0,因为它是许多算术计算的结果,而算术下溢会发生?这似乎是明智的!我不同意这个答案。认为浮点数代表小范围的值是许多混乱的根源,我们不应该鼓励这样做。零表示完全为零(OP没有问题,否则他们不会接受0乘以任何东西都应该为零的事实),而无穷表示概念上超出所有实的异常值(这是OP尚未接受的点)。@PascalCuoq在您的模型中,什么是负零?它为什么存在?@PascalCuoq从不将浮点值与“==”进行比较是没有意义的,而且这个“规则”是无意识地重复的,没有任何理由,而不是像我所看到的那样,通过“小间隔”模型。据我所知,-0的存在不仅仅是为了方便格式正交,而是通过有意识的设计:参见卡汉关于复杂函数中分支切割的论文,-0表示从下方接近零时的极限;也适用于与无穷大的平滑交互作用,例如,1/x,其中x为负且为底流。不产生不必要的数字来唯一标识二进制64对我来说似乎很好?我对浮点数的看法类似于物理学中的波/粒子二元论:有时最好将fp数视为点,有时最好将其视为间隔,具体取决于上下文。在处理trig函数的大参数时,库编写器不知道哪个上下文相关视图是合适的,因此需要在保守(点)方面出错。至于sqrt(-0)==0,我不记得是什么驱动了它,它在“负半平面接近零(通过下溢)”的心智模型下没有意义,但需要与+0==-0保持一致?