6

我刚刚在我的程序中发现了一些数字操作的错误,我得到了一个FloatDomainError (NaN)

所以我开始记录传入的号码:

if(metric.is_a?(Numeric))
  self.metric = metric
else
  LOGGER.warn("metric #{metric} is not a number")
  self.metric=0
end

但是传入的数字NaN显然是is_a?(Numeric)因为我没有收到日志警告,并且它将度量传递给我的 metric= 方法,这是我得到我的FloatDomainError

NaN现在,如果我错了,请纠正我,但是(Not A Number) 是 Numeric 类型在语义上似乎不是错误的吗?谁可以给我解释一下这个?

顺便说一句,使用 Jruby-1.4.1

4

2 回答 2

7

我认为让 NaN 成为一个数字非常有意义......

在 irb 中尝试 0.0 / 0.0 -> 结果为 NaN(在本例中为无穷大)

无穷大在数学上是一种数字,但是,您仍然不能用数据类型来表达它……在数学中,您也使用特殊符号……

PS:你可以使用metric.nan吗?检查它...那么它应该可以按您的预期工作...

于 2010-09-01T14:06:30.803 回答
5

IEEE 754 浮点数定义 -INFINITY +INFINITY 和 NotANumber 以使其能够对除以零做出反应。你也可以用这些来计算,例如 2 + INF = INF

NaN 不是一个独特的 ruby​​ 特性,它们在 java、c++、...中也是数字

于 2010-09-01T14:08:20.500 回答