【问题标题】:Why does the multiplicative inverse of 0 result in infinity?为什么0的乘法逆会导致无穷大?
【发布时间】:2021-07-08 15:53:27
【问题描述】:

我正在用 Swift 编写一个程序,该程序采用随机字节的乘法逆运算。有时,字节为0,当乘法逆时,结果为inf

乘法逆运算正在使用

powf(Float(byte), -1.0)

byte 的类型为 UInt8。如果byte 等于0,则结果为inf,如前所述。 0的乘法逆如何是无穷大的?因为0/0 的乘法逆元是0/0,所以乘法逆元不也是0吗?

【问题讨论】:

  • alias 的答案非常适合 IEEE 方面,但我想检查您的评论,即零的乘法逆数为零是有意义的。一个值的乘法逆元是乘以产生 1 的数字。0*0 绝对不是 1。关于 pow(0.0,-1.0) 的结果应该返回什么有很多合理的论据(甚至 0 也是一个合理的答案;它是pow(Int(0),-1) 返回什么)。但它永远不会是 0 的乘法倒数。这只是意味着 pow(x, -1) 并不总是返回乘法倒数。
  • (应该是pow(Decimal(0), -1)

标签: swift floating-point exponent uint


【解决方案1】:

插入0 只是意味着它是0 除以某个正数。然后,乘法逆将除以0。您可能知道,这在数学中是未定义的,但在 swift 中,它会尝试计算它。本质上,它一直从数字中减去0,但永远不会得到结果,所以它会输出无穷大。

编辑:正如 Alias 所指出的,Swift 实际上并没有经历不断减去0 的过程。只要它应该除以 0,它就会返回无穷大。

【讨论】:

  • 这个答案确实具有误导性:Swift(或任何其他语言)根本不尝试计算任何东西:它只是将这些传递给底层硬件,其中浮点数除以零定义为无穷大.
  • 是的,这是一个很好的观点,我只是想解释为什么会给出这个结果。
【解决方案2】:

简答:根据定义。在 Swift(和许多其他语言)中,浮点数由 IEEE-754 定义的浮点数支持,在大多数情况下由底层硬件直接实现,因此速度非常快。根据该标准,浮点数除以 0 被定义为 Infinity,而 Swift 只是将该结果返回给您。 (准确地说,0/0定义为NaN,任何正数除以0定义为Infinity,任何负数除以0定义为-Infinity。)

一个有趣的问题可能是“为什么?”为什么 IEEE-754 将浮点数除以 0 定义为 Infinity,人们可以合理地期望机器抛出错误,或者将其定义为 NaN(非数字),或者甚至可能0?要对此进行分析,您应该真正阅读 Kahan(IEEE-754 背后的语义设计者)own notes 关于此事的内容。从链接文档的第 10 页开始,他讨论了为什么选择 Infinity 更适合除零,这基本上归结为数值算法的有效实现,因为这种约定允许在迭代数值分析中跳过昂贵的测试。从第 10 页开始阅读,并通过他讨论的示例,在第 14 页结束。

总结:浮点除以 0 被 IEEE-754 标准定义为Infinity,做出这个选择是有充分理由的。当然,可以想象不同的系统也会采用不同的答案,这取决于它们的特定需求或应用领域;但它们将不符合 IEEE-754。

【讨论】:

  • "任何正数除以0定义为Infinity,任何负数除以0定义为-Infinity" --> 还有-0.0反转商号。
猜你喜欢
  • 1970-01-01
  • 2016-10-16
  • 2020-12-01
  • 1970-01-01
  • 2017-08-31
  • 1970-01-01
  • 2016-12-11
  • 2018-07-10
相关资源
最近更新 更多