Alguém pode me explicar Nan em Ruby?
Pergunta
Acabei de encontrar um bug em algumas manipulações de números no meu programa e estou recebendo um FloatDomainError (NaN)
Então eu comecei a registrar o número que passou com:
if(metric.is_a?(Numeric))
self.metric = metric
else
LOGGER.warn("metric #{metric} is not a number")
self.metric=0
end
Mas o número que está sendo passado é NaN
que aparentemente is_a?(Numeric)
Como eu não recebo meu aviso de log, e ele passa a métrica para minha métrica = método, que é onde eu recebo meu FloatDomainError
Agora, corrija -me se estou errado, mas não parece semanticamente errado ter um NaN
(Não um número) seja do tipo numérico ?? Alguém pode me explicar isso?
BTW usando Jruby-1.4.1
Solução
Os números de ponto flutuante IEEE 754 definem -infinity +Infinity e Notanumber para possibilitar reagir à Divisão, por exemplo, por zero. Você também pode calcular com eles para EG 2 + INF = INF
Nan não é um recurso uniqe ruby, eles são numéricos em java, c ++, ... também
Outras dicas
Eu acho que fazer Nan um número faz perfeitamente sentido ...
Tente 0,0 / 0,0 em IRB -> O resultado é NAN (que neste caso é o infinito)
O Infinity é matematicamente um número, mas ainda assim, você não pode expressá -lo com um tipo de dados ... em matemática, você também usa um símbolo especial ...
PS: Você pode usar o metric.nan? Para verificar ... então deve funcionar como você espera ...