为什么在Ruby 0.0 / 0,3.0 / 0和3/0中表现不同?

时间:2011-10-11 13:15:11

标签: ruby integer-division divide-by-zero

如果除以0,我会得到ZeroDivisionError,Infinity或NaN,具体取决于划分的内容。

ruby-1.9.2-p180 :018 > 0.0 / 0
 => NaN 

ruby-1.9.2-p180 :020 > 3.0 / 0
 => Infinity 

ruby-1.9.2-p180 :021 > 3 / 0
ZeroDivisionError: divided by 0

据我所知,0.0 / 0不是无限(用数学术语表示),而3.0 / 0是为什么那么为什么不是3/0无穷大?为什么划分整数会引发异常,但划分浮点数不会?

2 个答案:

答案 0 :(得分:9)

在Ruby中,并非所有数字都是相同的(双关语)。

十进制数字(0.03.0)遵循IEEE 754-2008 standard进行浮点运算:

  

标准定义   算术格式:二进制和十进制浮点数据集,由有限数(包括有符号零和次正规数),无穷大和特殊“非数字”值组成( NaNs < /强>)

整数(03)被视为整数。

NaNInfinity(以及-Infinity)都是特殊情况,这些浮点数旨在处理,但整数不是 - 因此是错误。

答案 1 :(得分:3)

3.0 / 0等于Infinity的原因是Ruby实现的IEEE 754规范(浮点运算标准)。

http://weblog.jamisbuck.org/2007/2/7/infinity

http://en.wikipedia.org/wiki/IEEE_754

顺便说一句,我发现这张桌子非常有趣:http://users.tkk.fi/jhi/infnan.html