为什么0的乘法逆元结果是无穷大?

5

我正在使用Swift编写一个程序,用于获取随机字节的倒数。有时,该字节为0,当取倒数时,结果会变成inf

使用以下方式来确定倒数:

powf(Float(byte), -1.0)

byteUInt8 类型。如果 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)并不总是返回乘法逆元。 - Rob Napier
(应该是 pow(Decimal(0), -1) - Rob Napier
2个回答

5
简短回答:根据定义。在Swift(以及许多其他语言)中,浮点数是由IEEE-754定义支持的,该标准在大多数情况下直接由底层硬件实现,因此非常快速。根据该标准,浮点数除以0被定义为Infinity,Swift仅将该结果返回给您。(确切地说,0/0被定义为NaN,任何正数除以0被定义为Infinity,任何负数除以0被定义为-Infinity。)
一个有趣的问题是,“为什么?”为什么IEEE-754定义浮点数除以0为Infinity,而我们也可以合理地期望机器抛出错误,或者将其定义为NaN(非数字),甚至是0?如果您想分析这个问题,那么您应该阅读Kahan(IEEE-754语义设计者)关于这个问题的自己的笔记。从链接文档的第10页开始,他讨论了为什么选择Infinity作为除零的首选项,这主要归结于数值算法的高效实现,因为这种约定允许在迭代数值分析中跳过昂贵的测试。从第10页开始阅读,并阅读他所讨论的示例,这些示例在第14页的顶部结束。
总之:IEEE-754标准将浮点数除以0定义为Infinity,这样做有很好的理由。当然,不同的系统也可以想象采用不同的答案,具体取决于它们特定的需求或应用领域;但是,它们就不会符合IEEE-754标准。

任何正数除以0都定义为无穷大,而任何负数除以0都定义为负无穷。同时还存在-0.0,它可以改变商的符号。 - chux - Reinstate Monica

1
插入0只是意味着它被某个正数除以0。然后,乘法逆元将被除以0。你可能知道,在数学中这是未定义的,但在Swift中,它尝试计算它。基本上,它会从数字中不断地减去0,但永远不会得到结果,因此它将输出无穷大。
编辑:正如Alias指出的那样,Swift实际上并没有进行不断减去0的过程。每当它应该除以0时,它只会返回无穷大。

1
这个答案真的很误导人:Swift(或任何其他语言)根本不会尝试计算任何东西:它只是将这些传递给底层硬件,在那里浮点数除以零的结果定义为无穷大。 - alias
是的,那是个好观点。我只是试图解释为什么会得到那个结果。 - lizard_heart

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