gpt4 book ai didi

ruby - ruby 如何处理零除法?

转载 作者:数据小太阳 更新时间:2023-10-29 06:43:12 24 4
gpt4 key购买 nike

我正在尝试了解 ruby​​ 如何处理零除法。 Ruby 根据类返回不同的结果。这是我试过的

0/0     # => ZeroDivisionError: divided by 0    
1/0 # => ZeroDivisionError: divided by 0
1.0/0 # => Infinity
0.0/0.0 # => NaN

这里发生了什么?对于上述所有情况,我不应该得到一个 ZeroDivisionError 吗?

更新那么“无限”是标准数据类型吗?

(1.0/0).class  # => Float

最佳答案

Ruby 只跟踪 IEEE 754 Floating Point Standard .该维基百科页面在解释您所看到的内容方面做得不错。许多现代语言采用相同的方法。

直觉上,您看到的行为是完全合理的。一般来说,

1/<small number> = <big number>

因此在极限情况下,

1/0 -> Infinity    and similarly    -1/0 -> -Infinity

Infinity 是浮点子系统理解的常量。另一方面

0 / <any non-zero> = 0

所以我们在 0/0 上有冲突。它应该是零还是无穷大? IEEE 标准答案是“不是数字”,即您看到的 NaN,另一个浮点常量。

常量 NaN 和加号或减号 Infinity 以同样有意义的方式通过表达式传播。例如:

Infinity + <any (necessarly finite) number> = Infinity

<any number> + NaN = NaN

更有趣的是:

1 / Infinity = 0

您可以自己尝试:

irb(main):005:0> 1.0 / (1.0 / 0.0)
=> 0.0

以这种方式,浮点计算即使在溢出或除以零时也可以继续,并且仍然会产生一个合理的信息答案(尽管在你很好地了解标准之后,你会发现依赖答案通常是不好的想法)。

这远非标准提供的唯一行为。可以选择其他的。但 Ruby 会为您做到这一点。源文件numeric.c ,函数 Init_Numeric,设置主机处理器以便除以零传播无穷大。其他语言可能会做出其他选择,例如生成异常。

关于ruby - ruby 如何处理零除法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18125535/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com