Nas*_*Nas 5 ruby floating-point
除以零表示Integer
a ZeroDivisionError
:
0 / 0 # ZeroDivisionError
Run Code Online (Sandbox Code Playgroud)
但是除以零Float
不会:
0.0 / 0 #NaN
0 / 0.0 #NaN
0.0 /0.0 #NaN
1.0 / 0 #Infinity
1 / 0.0 #Infinity
1.0 /0.0 #Infinity
Run Code Online (Sandbox Code Playgroud)
我想知道为什么RubyInteger
和Float
Ruby 的行为存在这种差异?
与几乎所有编程语言一样,ruby 的浮点运算实现符合IEEE 754标准。
该规范(上面链接)定义了必须(至少在默认情况下)以特定方式处理的五个异常:
无效运算:数学上未定义,例如,负数的平方根。默认情况下,返回 qNaN。
除以零:对有限操作数的运算给出精确的无限结果,例如 1/0 或 log(0)。默认情况下,返回±无穷大。
溢出:结果太大而无法正确表示(即,其指数范围无界的指数将大于 emax)。默认情况下,为舍入到最近的模式返回±无穷大(并遵循有向舍入模式的舍入规则)。
下溢:结果非常小(超出正常范围)并且不准确。默认情况下,返回次正规或零(遵循舍入规则)。
不精确:精确的(即未舍入的)结果无法精确表示。默认情况下,返回正确舍入的结果。
因此1.0/0
必须相等+Infinity
,并且0.0/0
必须相等NaN
。
Integer
对象不符合上述标准。(没有Infinity
or NaN
,并且所有操作都是精确的。)因此,为诸如1/0
.