有人可以解释一下 Ruby 中的 NaN 吗?

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(不是数字)作为数字类型是语义上错误的。有人能向我解释一下吗?

顺便说一下,我使用的是Jruby-1.4.1


1
如果附近有一些印度餐厅就好了.. :) 无法自拔 :D - user201788
1
我们会提供一个美味的答案 :) - brad
2个回答

7
我认为将NaN定义为数值是有道理的...
在irb中尝试0.0 / 0.0 -> 结果是NaN(在这种情况下是无穷大)
无穷大在数学上算是一种数,但你仍然不能用数据类型来表示它...在数学中你也会使用一个特殊的符号...
PS:你可以使用metric.nan?来检查它...然后它应该按照你的期望工作...

好的,我只是觉得从语义上讲,“非数字”是一个数字有点奇怪... - brad
@brad:嗯,我同意,那个状态的名称选择得不太好... :) - apirogov

6

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

NaN不是Ruby的独特功能,在Java、C++等语言中也有数字类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接