为什么Infinity×0 = NaN?

le_*_*e_m 1 floating-point numbers nan infinity ieee-754

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

但是,IEEE 754然后将0×∞的结果指定为NaN.

这感觉反直觉:为什么0×∞不是0?

  1. 我们可以认为1/0 =∞作为1/z的极限,因为z趋于零

  2. 我们可以认为0×∞= 0作为0×z的极限,因为z倾向于∞.

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

Pat*_*han 6

如果你不认为它们是零或无限的,那么理解IEEE 754浮点零和无穷大的行为就更容易了.

浮点零不仅表示实数为零.它们还表示所有可以舍入到小于最小次正规值的实数.这就是零签署的原因.如果它们实际上不是零,那么即使很小的数字也会有一个符号.

类似地,每个无穷大也表示具有相应符号的所有数字,该符号将舍入到具有不适合有限范围的量级的某个数字.

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

非常大的非常大的东西非常大,所以`Infinity/0 == Infinity".

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

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

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

假设f(x)倾向于无穷大并g(x)趋于零,因为x倾向于无穷大.很容易证明f(x)/g(x)倾向于无穷大x倾向于无穷大.另一方面,如果没有f(x)*g(x)关于功能的更多信息,就不可能证明有关限制的任何内容.

  • 我对浮点数的看法类似于物理学中的波/粒子二元论:有时最好将fp数视为一个点,有时最好将其视为一个区间,具体取决于上下文.当处理trig函数的大参数时,库编写者不知道哪个上下文依赖视图是合适的,因此需要在保守(点)方面犯错.至于sqrt(-0)== 0,我不记得是什么推动了它,它在"负半平面(通过下溢)"的心理模型的"接近零"下没有意义,但需要与+的一致性0 == - 0? (3认同)
  • @PascalCuoq在你的模型中,什么是负零以及为什么它存在? (2认同)
  • @PascalCuoq 永远不要将浮点值与“==”进行比较是没有意义的,并且就我所见,这个“规则”在没有理由的情况下无意识地重复,而不是诉诸“小区间”模型。据我所知,-0 的存在不仅仅是为了格式正交性的方便,而是出于有意识的设计:参见 Kahan 关于复杂函数中的分支切割的论文,-0 表示从下方接近零时的限制;也用于与无穷大的平滑交互,例如 1/x,其中 x 为负且下溢。不产生不必要的数字来唯一标识“binary64”对我来说似乎没问题? (2认同)