为什么 0 的乘法逆元会导致无穷大?

Why does the multiplicative inverse of 0 result in infinity?

我正在 Swift 中编写一个程序,它采用随机字节的乘法逆。有时字节为0,取乘法逆时,结果为inf.

正在使用

确定乘法逆元
powf(Float(byte), -1.0)

byteUInt8 类型。如果byte等于0,结果就是前面提到的inf。 0 的乘法逆元怎么会是无穷大?因为 0/0 的乘法逆元是 0/0,所以乘法逆元不也是 0 吗?

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

编辑:正如 Alias 指出的那样,Swift 实际上并没有经历不断减去 0 的过程。它只会 return 无穷大任何时候它应该除以 0.

简短回答:根据定义。在 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 标准。