Question

  

Possible en double:    Vérification si un double (ou float) est nan en C ++

J'ai l'obligation de vérifier si flotteur est NaN. En passant par quelques-uns des liens que je trouve le chèque le plus courant.

FLOAT32 f32_test_NaN = (some_value);
if (f32_test_NaN == f32_test_NaN)
{
    //do something;
}
else
{
    // do something;
}

Mais cela ne semble pas fonctionner pour moi. Mon code est le suivant:

FLOAT32 test_NaN = 0x414570A3;//some value - is this ok?

Debugging sur GDB:

(gdb) p test_NaN
$1 = 1.09506982e+09

(gdb) p/x test_NaN
$2 = 0x41457080 // Hex is not same as init value - What is compiler doing?

Donc dans mon cas test_NaN est égal à test_NaN.

S'il vous plaît laissez-moi savoir si un paramètre du compilateur doit être fait. Je suis en cours d'exécution sur solaris. Ou est-il une autre façon de vérifier la même chose.

Merci à l'avance.

Était-ce utile?

La solution

Le problème est peut-être dans votre initialisation (au moins qui explique la valeur que vous voyez dans gdb):

FLOAT32 test_NaN = 0x414570A3;

La valeur hexadécimale donnée est considérée comme un entier et converti en float (avec un exposant et valeur) ce qui signifie qu'il est stocké dans un format différent.

Si vous voulez forcer les bits à l'intérieur du flotteur, alors vous devez memcpy:

FLOAT32 test_NaN;
memcpy(&test_NaN, 0x414570A3, 4);

Autres conseils

Inclure math.h et l'utilisation int isnan(x). Ne pas oublier de lien avec -lm

Si <math.h> n'est pas disponible, procédez comme suit:

if (x != x)
{
    // x is NaN
}

if (x! = X)

Pour x = 0x7FBFFFFF (signe bit 0, a = 0, le repos de bits 1)

http://en.wikipedia.org/wiki/NaN

  

Un exemple au niveau du bit d'un type simple précision IEEE à virgule flottante (32 bits) NaN: s111 1111 1axx xxxx xxxx xxxx xxxx xxxx où s est le signe, x est la charge utile, et détermine le type de NaN . Si a = 1, il est un endroit calme NaN; si un est égal à zéro et la charge utile est non nul, alors il est un NAN de signalisation

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