我只是好奇,为什么在IEEE-754中,任何非零浮点数除以零都会产生无穷大的值?从数学的角度看,这是胡说八道。所以我认为这次手术的正确结果是NaN。
函数f(x)=1/x在x=0时没有定义,如果x是实数。例如,如果IEEE-754生成NaN值,则没有为任何负数定义函数sqrt和sqrt(-1.0f)。但是1.0f/0是Inf。
但由于某种原因,在IEEE-754中并非如此。这肯定是有原因的,可能是一些优化或兼容性的原因。
那有什么意义呢?
- 在这个pdf中有一些有趣的讨论:cs.berkeley.edu/~wkahan/ieee754status/ieee754.pdf。
- 定义了从左到右的两个极限。这就是为什么人们普遍认为结果是无穷大的原因。
- 为什么胡说八道?从数学角度看lim[x→0](1/x)=∞
- 右极限为∞,左极限为-∞,函数f(x)=1/x在f(0)处不存在。
It's a nonsense from the mathematical perspective.
对。不。
问题是:浮点数是近似值。您希望使用范围广泛的指数和有限的数字,并获得并非完全错误的结果。:)
IEEE-754背后的想法是,每一个操作都可能触发"陷阱",表明可能存在的问题。他们是
- 非法(无意义的操作,如负数的sqrt)
- 溢出(太大)
- 下溢(太小)
- 除以零(你不喜欢的东西)
- 不精确(此操作可能会导致错误的结果,因为您正在失去精度)
现在许多像科学家和工程师这样的人不想为编写陷阱程序而烦恼。因此,IEEE-754的发明者卡汉决定,如果不存在陷阱例程,每个操作也应该返回一个合理的默认值。
他们是
- NaN表示非法值
- 溢出的有符号无穷大
- 下溢有符号零
- 不确定结果(0/0)的NaN和(x/0 x!的无穷大= 0)
- 不精确的正常运行结果
问题是,在所有情况下,99%的零是由下溢引起的,因此99%的零是由下溢引起的。在任何时候,无穷大都是"正确的",即使从数学的角度来看是错误的。
- 最后一句话对我来说很实用。
- 如果字面上的零以及正下溢、负下溢和不可区分值的减法的结果都是不同的,那么数字"敏感度"的水平可以提高,但是添加这种额外形式的"零"将具有复杂的浮点硬件。IEEE标准将上述两种形式的零合并成两种形式,这导致一些应该是NaN的东西变成+Inf。我怀疑其基本原理是,除法为+/-零会产生+/-Inf,而不是NaN不会增加太多硬件,偶尔也会有用。
- 是的,这澄清了在IEEE标准中签名为零的理由。
- @supercat你一定要写下你的评论作为答案
我不知道你为什么会相信这是胡说八道。
a / b的简单定义,至少对于非零的b来说,是b的唯一数字,在归零之前必须从a中减去。
把它推广到b可以为零的情况下,必须从任何非零数字中减去才能得到零的数字实际上是无限的,因为你永远不会得到零。
另一种看待它的方法是从限制的角度来讨论。当正数n接近于零时,表达式1 / n接近于"无穷大"。你会注意到我引用了这个词,因为我坚信不传播无限实际上是一个具体数字的错觉。
NaN是为数字不能(甚至近似地)用任何其他值(包括无穷大)表示的情况而保留的,它被认为与所有其他值不同。
例如,0 / 0(使用上述简单的定义)可以从a中减去任何数量的b以达到0。因此,结果是不确定的——可能是1、7、42、3.14159或任何其他值。
类似地,负数的平方根在IEEE754使用的实平面中没有值(为此必须转到复平面),也不能表示。
- 另一方面,如果1/0是inf,则inf*0必须等于1,但情况并非如此:)
- @拉辛,虽然这很幽默,但实际上并不是这样的,因为"无限"是一个概念,意思是"超越数字",它实际上不是一个数字本身。所以,虽然1/0给了你数字以外的东西,但无穷多的零总是0。现在我的头要爆炸了,因为我很久以前忘记的所有超限垃圾都淹没了我的头盖骨——我得给你开发票,让你把我键盘上的血块和脑组织清除掉。
- @paxdiablo无穷大是否是算术系统的一部分完全取决于该系统是如何定义的。考虑射影和扩展实线算法。
- 再加一句,numberphile(youtube.com/watch?v=brrolktlf6q)有一个很好的视频,说明为什么不应将x / 0视为无穷大,包括解决"我可以从x中取0无数次"的思想。总结一下,从代数的观点来看,你永远不应该说"等于无穷大",因为你指出它不是一个数字。
- "必须从任何非零数字中减去0才能得到零的数字确实是无穷大的。"—不,因为在无穷多的零减去之后,您/仍然/不会得到零。
- @达安,在现实世界中,将无穷大引入混合通常是一个游戏改变者(不一定是在"纯"的数学领域,但当然当你需要它来应用于某些描述的现实时)。我认为这是一个给定的条件,你永远不会得到零,因为做一件事无数次会持续到永远。然而,这是另一个现实的令人不安的概念:我会在答案中澄清你的观点。
- "既然做了一件事,无数次的时间将永远持续下去。"这是错误的思考方式,时间不是这里等式的一部分。你没有做过无数次的事情,有无数次的事情,它们都已经存在了——这是数学中理解无穷概念的重要一点。当人们争论0.99…是否等于1。如果你简单地接受9的数字是无限的,那么很容易理解在0.99之间没有其他的数字……1和0.99…只是写1的另一种方式
- @2072,如果你连续地从10中减去0,直到你达到0,那确实是无限次(或者动作或操作,如果你喜欢一个不同的术语-我想确保它不会被误解为与时间本身有关)。它不是无限多的东西。
- @paxdiablo你的答案用词表达了正确的算术性质,即a / b = c与a - c*b = 0相同。然而,你的论点是,如果b = 0那么c = +Inf似乎不符合逻辑。这表明,c或+Inf是0的确切数目,必须从a中减去该数目才能达到零(而不是从零到负)。这意味着+Inf必须根据上下文改变其值(即a的变化)。没有数字具有这种性质,因此,+Inf不是数字:+Inf == NaN。
- 我认为@thorsten的技术论证是有道理的,但数学论证确实是胡说八道。
- @罗伯,你犯了和很多人一样的错误,认为无穷大是某种具体的数字。不是这样。相反,它是一个"超越任何数字"的概念。这就是为什么我更愿意说某个东西是无限的,而不是它"等于"无穷大的原因——后者在常用的用法中已经被破坏了。不管a的值是多少,c总是无穷大的(当然,假定后者是非零的)。
- 我的观点是,你的答案表明:A/B的简单定义是在你归零之前,必须从A中减去B的数目。然而,我们要指出的是,无穷大不是一个数。
- @罗布,好吧,我知道你从哪里来。我改变了答案来澄清这一点。希望它更有意义。
在数学中,被零除是未定义的,因为零没有符号,因此两个结果是同样可能的,并且是排他的:负无穷大或正无穷大(但不是两者)。
在(大多数)计算中,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*x,g(x) >= 0。在这种情况下,极限被定义为无穷大,符号等于f(0)的符号。您可能希望利用这一点作为代码中的便利。在其他情况下,如果您不知道g的符号,通常不能利用它,但这里的成本只是您需要捕获一些额外的情况-正无穷大和负无穷大-除了NaN如果您想完全错误检查您的代码。这里有一些价格,但与其他情况下获得的灵活性相比,这个价格并不高。
当问题是关于"简单除法"时,为什么要担心一般函数呢?一个常见的原因是,如果通过其他算术运算计算分子和分母,则会累积舍入误差。这些错误的存在可以抽象为上面所示的一般公式格式。例如,f(x) = x + e,其中x是分析正确、准确的答案,e表示舍入误差,f(x)是执行时机器上实际存在的浮点数。
- 当n=0时,你就没有极限了,因为从左边接近,你得到负无穷大,从右边接近,你得到正无穷大。从微积分来看,当左极限和右极限不匹配时,你根本就没有极限,"我很惊讶你记住了这么多,而且在你的第一句话中还是错了。事实上,如果"左"和"右"限制不一致,则限制是未定义的…但这是任何一个n的情况,而不仅仅是0。这些错误并不少见,但请不要在你不理解的主题上对人们进行演讲。
- @Cubic这里有问题,所以我很快就会更正或删除。有趣的是,特别是考虑到你的口气,你的评论也是错误的。当我写的表达式中n=0时,限制为0。这是一个特殊的情况,因为在这种情况下,左右限制是一致的。
- 哈哈,也许我当时应该接受我自己的建议;)但不知道你说的下流话是什么意思。
- 再说一次,我不太明白。我的意思是,字面意思是,不要回答你没有答案的问题,否则你只会使常见的误解永存。我试着自己遵守这一点,但很明显,有时你只是错了,却没有意识到(就像我在这里展示了自己一样)。
- @立方体看看你是否喜欢这个版本。如果是这样,我建议我们删除对旧答案的评论。(我同意投赞成票,否则你的意见就消失了!):)如果仍然不够精确,我会接受另一个修订或放弃它。(尽管我犯了错误,但我确实知道……)