我正在用Swift编写一个程序,该程序采用随机字节的乘法逆。有时,该字节为0,并且在采用乘法逆时,结果为inf
。
正在使用以下方法确定乘法逆
powf(Float(byte), -1.0)
byte
的类型为UInt8
。如果byte
等于0,则结果为inf
,如前所述。 0的乘法逆数将是无穷大?因为0/0
的乘法逆是0/0
,所以乘法逆也不会为0吗?
最佳答案
简短答案:根据定义。在Swift(以及许多其他语言)中,浮点数由float的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。
关于swift - 为什么0的乘法逆数会导致无穷大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67077490/