Bonjour, je désire generer une erreur NaN dans une fonction que renvoi un float.
J'ai déjà trouvé ceci:
Mais ça ne fonctionne pas :( Ca renvoi un nombre existantCode:float NaN = (float)(0xFFFFFFFF);
Quelqu'un aurait il une solution?
Merci :)
Version imprimable
Bonjour, je désire generer une erreur NaN dans une fonction que renvoi un float.
J'ai déjà trouvé ceci:
Mais ça ne fonctionne pas :( Ca renvoi un nombre existantCode:float NaN = (float)(0xFFFFFFFF);
Quelqu'un aurait il une solution?
Merci :)
Salut,
Dans la classe std::numeric_limits, il existe deux méthodes qui te renvoient, justement la valeur correspondant à NaN: quiet_NaN() et signaling_NaN(), même si je n'arrive pas à expliquer la différence qui existe entre les deux...
Tu peux donc très bien envisager un code tout simple de l'ordre de
ou de l'ordre deCode:return std::numeric_limits<float>.quiet_NaN();
*Idealement*, ce serait aussi la valeur à tester pour savoir le retour est un nombre ou non ;)Code:return std::numeric_limits<float>.signaling_NaN();
Ceci dit, peut-être devrais tu envisager, plutot qu'une valeur de retour "invalide", de lancer simplement une exception (à récupérer le cas échéant dans une des fonctions appelante pour traitement) ;)
Heu, excuse l'ignorance mais c'est quoi un NaN?
Ca se traduit par "Not a Number"
Par exemple c'est ce qui arrive quand on divise par 0.
C'est une valeur particulière qu'un nombre peut prendre.
Et ça existe sur toutes les architectures pour tous les types de flottants?
Sauf erreur, cela existe pour tout type représentant une valeur...
Au fait, j'ai fait une erreur... il s'agit d'une méthode statique.
Le code à écrire est donc plutôt est du genre de
ou deCode:return std::limits<double>::quiet_NaN();
Code:return std::limits<double>::signaling_NaN();
La différence en te quiet et signaling, c'est que la version signaling est sensée lever un signal, afin d'être détecté au plus vite.
Un NaN ne peut pas être le résultat d'une division par 0, sauf 0/0 (ce serait +/-Inf).
Pour savoir si un nombre est un NaN, on ne peut par le comparer avec NaN !
Pour tout x (même NaN), x != NaN. Pour savoir si un nombre est un NaN, on peut faire :Tous les types n'ont pas de NaN (d'où l'intérêt de has_quiet_NaN et has_signaling_NaN dans numeric_limits), mais c'est demandé par la norme IEEE sur les flottants.Code:bool isNaN(float f) {return f != f;}