为什么无穷大乘以0等于NaN?

4
IEEE 754规定1/0的结果为∞(无穷大)。
然而,IEEE 754随后规定0×∞的结果为NaN(非数值)。
这感觉有点违反直觉:为什么0×∞不是0呢?
我们可以认为1/0=∞是当z趋近于零时1/z的极限。
我们可以认为0×∞=0是当z趋近于∞时0×z的极限。
为什么IEEE标准遵循直觉1而不是2呢?

1
因为无穷大不是一个具体的数字? - Michael Todd
2
无穷大乘以0并不容易定义。 - Mike Cluck
1
但是在 Infinity / 0 的情况下,除以零不是优先于分子中的任何内容吗?(我在这里并没有严格地争论数学问题。我只是猜测语言作者的意图。) - Michael Todd
1
在JavaScript中,无限大 一个数字,至少按类型而言是这样的,但它并不是真正的具体数字,不像 7 或其他的数字,它更像是一个概念, "最大的数字 "等等。当您将无限大与任何正数或负数相乘时,结果都会是正无穷大或负无穷大,因为它不能更大了。当您将一个数字除以无限大时,结果为 0 ,因为它不能再小了。 当你用 0 乘以无限大时,你得到的是“非数字”,因为某个人决定将其放入规范中。 - adeneo
3
为什么不把0无穷看作x趋近于零时x无穷的极限呢?这样做与另一种方式同样有道理。0*无穷存在问题并应该被视为NaN的原因是可以找到一个情况,将0、无穷和其中任何值联系起来。 - Patricia Shanahan
显示剩余8条评论
1个回答

10
如果你不把IEEE 754浮点数中的零和无穷看作字面意义上的零或无穷大,那么理解它们的行为就更容易了。
浮点数零不仅代表实数零,还代表所有四舍五入结果小于最小次标准化数的实数。这就是为什么零有符号的原因。即使是非常小的数字,如果它们不是真正的零,也有符号。
类似地,每个无穷大也代表着所有带有相应符号的数字,其大小超出了有限范围。
NaN表示“没有实数结果”,例如sqrt(-1),或者是“不知道”。
非常大的数除以非常小的数是非常大的,所以"Infinity / 0 == Infinity"。
非常大的数乘以非常小的数可能是任何值,取决于我们不知道的实际大小。由于结果可以是从非常小到非常大的任何值,因此NaN是最合理的答案。
虽然我认为以上是理解实际浮点数行为的最佳方法,但在实数极限中也存在类似的问题。
假设"f(x)"趋近于无穷大,而"g(x)"趋近于零,当"x"趋近于无穷大时。很容易证明,当"x"趋近于无穷大时,"f(x)/g(x)"趋近于无穷大。另一方面,在没有更多关于函数的信息的情况下,无法证明"f(x)*g(x)"的极限是什么。

浮点数计算中,既可以通过近似值得到零和无穷大,这在实数中并不等同于零或无穷大。现在我们有了一个准确表示零的浮点数值,以及一个准确表示无穷大的浮点数值。 - Pascal Cuoq
2
@PascalCuoq 在你的模型中,负零是什么,为什么会存在? - Patricia Shanahan
-0. 是另一种表示 0 的方式,它存在是为了避免复杂化符号-幅度表示法。在您的理解中,-0. 是什么?一个小的负间隔?0.0 - 0.0 的相反数?为什么 sqrt(-0.) 是它所表示的内容? - Pascal Cuoq
3
用“==”运算符比较浮点数是没有意义的,这个“规则”被毫无理由地重复使用,至少我所见过的并没有使用“小区间”模型来进行解释。据我所知,“-0”不仅仅是为了格式正交而存在,而是经过有意识的设计:参见Kahan有关复杂函数分支切割的论文,-0代表从下方逼近零时的极限;同样用于与无穷大的平滑交互,例如1/x,其中x为负且下溢。不产生不必要唯一标识“binary64”的数字对我来说似乎是可以接受的? - njuffa
5
我的浮点数观点类似于物理学中的波粒二象性:有时将fp数字视为点是最好的,而在其他情况下,则最好将其视为区间,这取决于上下文。处理三角函数的大参数时,库编写者不知道哪种依赖于上下文的观点是合适的,因此需要在保守(点)方面出错。至于sqrt(-0)== 0,我不记得是什么原因驱动了它,在“通过下溢从负半平面接近零”的心理模型下并没有意义,但需要与+0 == -0保持一致。 - njuffa
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接