diff liboctave/lo-ieee.cc @ 11234:2718e1fdf82f

IEEE math initialization tweaks
author John W. Eaton <jwe@octave.org>
date Wed, 10 Nov 2010 21:52:51 -0500
parents 9c6143abf9e1
children fd0a3ac60b0e
line wrap: on
line diff
--- a/liboctave/lo-ieee.cc
+++ b/liboctave/lo-ieee.cc
@@ -25,37 +25,17 @@
 #include <config.h>
 #endif
 
-#include <cfloat>
 #include <cstdlib>
 
-#if defined (HAVE_FLOATINGPOINT_H)
-#include <floatingpoint.h>
-#endif
-
-#if defined (HAVE_IEEEFP_H)
-#include <ieeefp.h>
-#endif
-
-#if defined (HAVE_NAN_H)
-#include <nan.h>
-#endif
+#include <limits>
 
 #include "lo-error.h"
 #include "lo-ieee.h"
-#include "lo-math.h"
 #include "mach-info.h"
 
 void
 octave_ieee_init (void)
 {
-  // Default values.  DBL_MAX is not right for NaN and NA, but do you
-  // have a better suggestion?  If you don't have IEEE floating point
-  // values, there are many parts of Octave that will not work
-  // correctly.
-
-  octave_Inf = octave_NaN = octave_NA = DBL_MAX;
-  octave_Float_Inf = octave_Float_NaN = octave_Float_NA = FLT_MAX;
-
   oct_mach_info::float_format ff = oct_mach_info::native_float_format ();
 
   switch (ff)
@@ -63,41 +43,13 @@
     case oct_mach_info::flt_fmt_ieee_big_endian:
     case oct_mach_info::flt_fmt_ieee_little_endian:
       {
-        // Don't optimize away tmp_inf / tmp_inf to generate octave_NaN.
-
-        volatile double tmp_inf;
+        octave_NaN = std::numeric_limits<double>::quiet_NaN ();
+        octave_Inf = std::numeric_limits<double>::infinity ();
 
-#if defined (__alpha__) && defined (__osf__)
-        extern unsigned int DINFINITY[2];
-        tmp_inf =  (*(X_CAST(double *, DINFINITY)));
-#else
-        double tmp = 1e+10;
-        tmp_inf = tmp;
-        for (;;)
-          {
-            tmp_inf *= 1e+10;
-            if (tmp_inf == tmp)
-              break;
-            tmp = tmp_inf;
-          }
-#endif
+        octave_Float_NaN = std::numeric_limits<float>::quiet_NaN ();
+        octave_Float_Inf = std::numeric_limits<float>::infinity ();
 
-#if defined (__alpha__) && defined (__osf__)
-        extern unsigned int DQNAN[2];
-        octave_NaN = (*(X_CAST(double *, DQNAN)));
-#elif defined (__NetBSD__)
-        octave_NaN = nan ("");
-#else
-        octave_NaN = tmp_inf / tmp_inf;
-        // try to ensure that lo_ieee_sign gives false for a NaN.
-        if (lo_ieee_signbit (octave_NaN))
-          octave_NaN = -octave_NaN;
-
-#endif
-
-        octave_Inf = tmp_inf;
-
-        // This is patterned after code in R.
+        // The following is patterned after code in R.
 
         if (ff == oct_mach_info::flt_fmt_ieee_big_endian)
           {
@@ -116,25 +68,6 @@
 
         octave_NA = t.value;
 
-        volatile float float_tmp_inf;
-
-        float float_tmp = 1e+10;
-        float_tmp_inf = float_tmp;
-        for (;;)
-          {
-            float_tmp_inf *= 1e+10;
-            if (float_tmp_inf == float_tmp)
-              break;
-            float_tmp = float_tmp_inf;
-          }
-
-#if defined (__NetBSD__)
-        octave_Float_NaN = nanf ("");
-#else
-        octave_Float_NaN = float_tmp_inf / float_tmp_inf;
-#endif
-        octave_Float_Inf = float_tmp_inf;
-
         lo_ieee_float tf;
         tf.word = LO_IEEE_NA_FLOAT;
         octave_Float_NA = tf.value;