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

Foi útil?

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 ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top