为什么是南?没有在ruby Fixnum上实现?

时间:2014-07-29 21:05:48

标签: ruby nan

我有一个类,我使用Fixnum默认值。我想设置一个警卫来确保该类永远不会使用NaN参数进行实例化。我惊愕地发现Fixnum不支持nan?。我有一个解决方法。我只是想知道为什么。

class Table

  attr_reader :rows, :min, :max, :increment
  def initialize min = 0, max = 100, increment = 20
    min = 0 if min.respond_to?(:nan?) && min.nan?
    max = 100 if max.respond_to?(:nam?) && max.nan?
    @min, @max, @increment, @rows = min.floor, max.ceil, increment, []
  end
end

要清楚,这就是我所说的行为:

[8] pry(main)> 0.0.nan?
=> false
[9] pry(main)> BigDecimal.new(0).nan?
=> false
[10] pry(main)> 0.nan?
NoMethodError: undefined method `nan?' for 0:Fixnum
from (pry):10:in `__pry__'

例如,除以零后的行为。

[1] pry(main)> 0/0
ZeroDivisionError: divided by 0
from (pry):1:in `/'
[2] pry(main)> 0.0/0.0
=> NaN
[3] pry(main)> BigDecimal.new(0) / BigDecimal.new(0)
=> #<BigDecimal:1029faf80,'NaN',9(36)>
[4] pry(main)> 

1 个答案:

答案 0 :(得分:4)

可能是因为整数是有限数或有限数,而NaN不适用于它。

来自Wikipedia

  

在计算中,NaN(不是数字)是数字数据类型   值表示未定义或不可表示的值,尤其是   在浮点计算中。引入了NaNs的系统用途   1985年的IEEE 754浮点标准,以及   其他非有限量的表示,如无穷大。

进一步检查:

0.0.class
# => Float
0.class
# => Fixnum
0.class.superclass
# => Integer