strtok_r: Avoid triggering bug in AIX 7.1 xlc compiler.
[gnulib.git] / lib / isnan.c
index 81f394d..ee9fa8b 100644 (file)
@@ -1,5 +1,5 @@
 /* Test for NaN that does not need libm.
-   Copyright (C) 2007-2008 Free Software Foundation, Inc.
+   Copyright (C) 2007-2010 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 
 #include <config.h>
 
+/* Specification.  */
+#ifdef USE_LONG_DOUBLE
+/* Specification found in math.h or isnanl-nolibm.h.  */
+extern int rpl_isnanl (long double x);
+#elif ! defined USE_FLOAT
+/* Specification found in math.h or isnand-nolibm.h.  */
+extern int rpl_isnand (double x);
+#else /* defined USE_FLOAT */
+/* Specification found in math.h or isnanf-nolibm.h.  */
+extern int rpl_isnanf (float x);
+#endif
+
 #include <float.h>
-#include <math.h>
 #include <string.h>
 
 #include "float+.h"
@@ -112,10 +123,11 @@ FUNC (DOUBLE x)
      also fails when constant-folding 0.0 / 0.0 even when constant-folding is
      not required.  The SGI MIPSpro C compiler complains about "floating-point
      operation result is out of range".  */
+  static DOUBLE zero = L_(0.0);
   memory_double nan;
   DOUBLE plus_inf = L_(1.0) / L_(0.0);
   DOUBLE minus_inf = -L_(1.0) / L_(0.0);
-  nan.value = NAN;
+  nan.value = zero / zero;
 #  else
   static memory_double nan = { L_(0.0) / L_(0.0) };
   static DOUBLE plus_inf = L_(1.0) / L_(0.0);
@@ -128,10 +140,10 @@ FUNC (DOUBLE x)
        -Infinity, which have the same exponent.  */
     m.value = x;
     if (((m.word[EXPBIT0_WORD] ^ nan.word[EXPBIT0_WORD])
-        & (EXP_MASK << EXPBIT0_BIT))
-       == 0)
+         & (EXP_MASK << EXPBIT0_BIT))
+        == 0)
       return (memcmp (&m.value, &plus_inf, SIZE) != 0
-             && memcmp (&m.value, &minus_inf, SIZE) != 0);
+              && memcmp (&m.value, &minus_inf, SIZE) != 0);
     else
       return 0;
   }