Mercurial > hg > octave-nkf
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;