2011-08-31 1 views
2

Je compile le code suivant avec l'option -ffast-math:Mingw32 std :: isnan avec -ffast-math

#include <limits> 
#include <cmath> 
#include <iostream> 

int main() { 
    std::cout << std::isnan(std::numeric_limits<double>::quiet_NaN()) << std::endl; 
} 

Je reçois 0 en sortie. Comment mon code peut-il indiquer si un nombre à virgule flottante est NaN lorsqu'il est compilé avec -ffast-math?

Remarque: Sur linux, std :: isnan fonctionne même avec -fast-math.

Répondre

10

Depuis -ffast-math GCC ne pas instruit gérer NaN s, il est prévu que isnan() a un comportement non défini. Renvoyer 0 est donc valide.

Vous pouvez utiliser le remplacement rapide suivant pour isnan():

#if defined __FAST_MATH__ 
# undef isnan 
#endif 
#if !defined isnan 
# define isnan isnan 
# include <stdint.h> 
static inline int isnan(float f) 
{ 
    union { float f; uint32_t x; } u = { f }; 
    return (u.x << 1) > 0xff000000u; 
} 
#endif 
1

Sur linux, le drapeau gcc -ffast-math brise isnan(), isinf() et isfinite() - il peut y avoir d'autres fonctions connexes qui sont aussi brisé que je ne l'ai pas testé .

L'astuce d'envelopper la fonction/macro entre parenthèses aussi ne fonctionne pas (ie. (isnan)(x))

Suppression -ffast-math travaux ;-)