关于整数除法:为什么在Ruby0.0/0、3.0/0和3/0中表现不同?

Why in Ruby 0.0/0, 3.0/0 and 3/0 behave differently?

如果除以0,就得到零分误差,无穷大或NaN,这取决于被除以的内容。

1
2
3
4
5
6
7
8
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不是无穷大呢?为什么整数的除法会引发一个异常,而浮点的除法却不会呢?


在Ruby中,并不是所有的数字都是相等的(双关语是故意的)。

十进制数(0.03.0遵循IEEE 754-2008浮点数算术标准:

The standard defines
arithmetic formats: sets of binary and decimal floating-point data, which consist of finite numbers (including signed zeros and subnormal numbers), infinities, and special"not a number" values (NaNs)

整数(03被视为整数。

NaNInfinity(以及-Infinity)都是这种浮点数设计用来处理的特殊情况,但是整数不是——因此是错误。


3.0/0等于无穷大的原因是Ruby实现的IEEE754规范(浮点算术标准)。

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

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

顺便说一句,我觉得这个表很有趣:http://users.tkk.fi/jhi/infnan.html