我正在使用Swift编写一个程序,用于获取随机字节的倒数。有时,该字节为0,当取倒数时,结果会变成inf
。
使用以下方式来确定倒数:
powf(Float(byte), -1.0)
byte
是 UInt8
类型。如果 byte
等于 0,则结果为 inf
,如前所述。那么 0 的乘法逆元怎么会是无穷大呢?难道不应该乘法逆元也是 0 吗,因为 0/0
的乘法逆元是 0/0
吗?
我正在使用Swift编写一个程序,用于获取随机字节的倒数。有时,该字节为0,当取倒数时,结果会变成inf
。
使用以下方式来确定倒数:
powf(Float(byte), -1.0)
byte
是 UInt8
类型。如果 byte
等于 0,则结果为 inf
,如前所述。那么 0 的乘法逆元怎么会是无穷大呢?难道不应该乘法逆元也是 0 吗,因为 0/0
的乘法逆元是 0/0
吗?
Infinity
,Swift仅将该结果返回给您。(确切地说,0/0
被定义为NaN
,任何正数除以0
被定义为Infinity
,任何负数除以0
被定义为-Infinity
。)Infinity
,而我们也可以合理地期望机器抛出错误,或者将其定义为NaN
(非数字),甚至是0?如果您想分析这个问题,那么您应该阅读Kahan(IEEE-754语义设计者)关于这个问题的自己的笔记。从链接文档的第10页开始,他讨论了为什么选择Infinity
作为除零的首选项,这主要归结于数值算法的高效实现,因为这种约定允许在迭代数值分析中跳过昂贵的测试。从第10页开始阅读,并阅读他所讨论的示例,这些示例在第14页的顶部结束。Infinity
,这样做有很好的理由。当然,不同的系统也可以想象采用不同的答案,具体取决于它们特定的需求或应用领域;但是,它们就不会符合IEEE-754标准。0
只是意味着它被某个正数除以0
。然后,乘法逆元将被除以0
。你可能知道,在数学中这是未定义的,但在Swift中,它尝试计算它。基本上,它会从数字中不断地减去0
,但永远不会得到结果,因此它将输出无穷大。0
的过程。每当它应该除以0时,它只会返回无穷大。
pow(0.0,-1.0)
的结果应该返回什么有很多合理的争论(甚至0也是一个合理的答案;这就是pow(Int(0),-1)
的返回值)。但它永远不会是0的乘法逆元。它只是意味着pow(x, -1)
并不总是返回乘法逆元。 - Rob Napierpow(Decimal(0), -1)
) - Rob Napier