Ruby 只跟踪IEEE 754 浮点标准。该维基百科页面在解释您所看到的内容方面并不差。许多现代语言采用相同的方法。
直觉上,你看到的行为是完全合理的。一般来说,
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, functionInit_Numeric
设置主机处理器,以便除以零传播无穷大。其他语言可能会做出其他选择,例如生成异常。