Quelqu'un peut-il me expliquer NaN en Ruby?
Question
Je viens de trouver un bug dans certaines manipulations numériques dans mon programme et je reçois un FloatDomainError (NaN)
Je commencé à enregistrer le nombre passé avec:
if(metric.is_a?(Numeric))
self.metric = metric
else
LOGGER.warn("metric #{metric} is not a number")
self.metric=0
end
Mais le nombre étant transmis est NaN
qui apparemment is_a?(Numeric)
que je ne reçois pas mon avertissement de journal, et il passe métrique à ma métrique = méthode, où je reçois mon FloatDomainError
Maintenant, corrigez-moi si je me trompe, mais ne pas semblent sémantiquement mal d'avoir un NaN
(Not A Number) soit de type numérique ?? Quelqu'un peut-il me l'expliquer?
BTW en utilisant JRuby-1.4.1
La solution
IEEE 754 nombres à virgule flottante définissent -Infinity + INFINITY et NotANumber pour permettre de réagir à la division permet de dire par zéro. vous pouvez également calculer avec ces derniers pour, par exemple 2 + INF INF =
NaN est pas une caractéristique rubis uniqe, ils sont numériques en java, c ++, ... trop
Autres conseils
Je pense que faire un certain nombre NaN ont donc un sens parfaitement ...
essayez 0.0 / 0.0 en RIR -> le résultat est NaN (qui dans ce cas est infini)
Infinity est mathématiquement une sorte de nombre, mais encore, vous ne pouvez pas l'exprimer avec un type de données ... en mathématiques que vous utilisez un symbole spécial trop ...
PS: Vous pouvez utiliser metric.nan? pour le vérifier ... alors il devrait fonctionner comme prévu ...