首页 > 解决方案 > 为什么浮点数除以零不会在 Ruby 中引发异常?

问题描述

Integer将 a除以零ZeroDivisionError

0 / 0 # ZeroDivisionError

但是除以零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

Integer我想知道为什么 Ruby和Ruby的行为会有这种差异Float

标签: rubyfloating-point

解决方案


与几乎所有编程语言一样,ruby 的浮点运算实现符合IEEE 754标准。

该规范(上面链接)定义了五个必须(至少在默认情况下)以特定方式处理的异常:

  • 无效运算:数学上未定义,例如,负数的平方根。默认情况下,返回 qNaN。

  • 除以零:对有限操作数的运算给出精确的无限结果,例如 1/0 或 log(0)。默认情况下,返回±无穷大。

  • 溢出:结果太大而无法正确表示(即,其具有无限指数范围的指数将大于 emax)。默认情况下,对于最近舍入模式返回 ±infinity(并遵循有向舍入模式的舍入规则)。

  • 下溢:结果非常小(超出正常范围)且不精确。默认情况下,返回次正规或零(遵循舍入规则)。

  • 不精确:精确(即未四舍五入的)结果不能精确表示。默认情况下,返回正确舍入的结果。

因此1.0/0必须相等+Infinity,而且0.0/0必须相等NaN


Integer对象不符合上述标准。(没有Infinityor NaN,并且所有操作都是精确的。)因此,针对诸如1/0.


推荐阅读