swift - 为什么0的乘法逆数会导致无穷大?

标签 swift floating-point exponent uint

我正在用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/

相关文章:

floating-point - 在序言中将 float 转换为整数

c - __STDC_IEC_559__ 与现代 C 编译器的状态

c++ - 将 "__m256 with random-bits"转换为 [0, 1] 范围的浮点值

algorithm - 高功率和 double

c - 求一个数落在 2 的哪个幂次方范围内? (在 C 中)

ios - 当键盘出现在 Swift 中时,UITextField 向上移动

ios - 在 iOS 中以编程方式更改日期选择器的高度

ios - 隐藏和显示 UI 导航栏按钮

swift - keyDown 事件不适用于 shift 键且仅适用于 shift 键

c++ - C++ 中的指数,使用循环