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

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top