# HG changeset patch # User Carnë Draug # Date 1511454422 0 # Node ID 48e7efceb427d60219425caa93321ae045b535d6 # Parent 8a89878ac8bc1de2abdfe3d31d170cfda13f06b9 libinterp/corefcn/data.cc: template eps() to reduce code duplication diff -r 8a89878ac8bc -r 48e7efceb427 libinterp/corefcn/data.cc --- a/libinterp/corefcn/data.cc Thu Nov 23 09:42:21 2017 -0800 +++ b/libinterp/corefcn/data.cc Thu Nov 23 16:27:02 2017 +0000 @@ -4451,6 +4451,31 @@ return fill_matrix (args, e_val, "e"); } +template +T +eps (const T& x) +{ + T epsval = x.abs (); + typedef typename T::value_type P; + for (octave_idx_type i = 0; i < x.numel (); i++) + { + P val = epsval.xelem (i); + if (octave::math::isnan (val) || octave::math::isinf (val)) + epsval(i) = octave::numeric_limits

::NaN (); + else if (val < std::numeric_limits

::min ()) + epsval(i) = std::numeric_limits

::denorm_min (); + else + { + int exponent; + octave::math::frexp (val, &exponent); + const P digits = std::numeric_limits

::digits; + epsval(i) = std::pow (static_cast

(2.0), + static_cast

(exponent - digits)); + } + } + return epsval; +} + DEFUN (eps, args, , doc: /* -*- texinfo -*- @deftypefn {} {} eps @@ -4490,54 +4515,15 @@ if (args.length () == 1 && ! args(0).is_string ()) { - octave_value arg0 = args(0).abs (); - + octave_value arg0 = args(0); if (arg0.is_single_type ()) { - Array x = arg0.float_array_value (); - - Array epsval (x.dims ()); - - for (octave_idx_type i = 0; i < x.numel (); i++) - { - float val = x.xelem (i); - if (octave::math::isnan (val) || octave::math::isinf (val)) - epsval(i) = lo_ieee_nan_value (); - else if (val < std::numeric_limits::min ()) - epsval(i) = powf (2.0, -149e0); - else - { - int exponent; - octave::math::frexp (val, &exponent); - epsval(i) = std::pow (2.0f, - static_cast (exponent - 24)); - } - } - + FloatNDArray epsval = eps (arg0.float_array_value ()); retval = epsval; } else { - Array x = arg0.array_value (); - - Array epsval (x.dims ()); - - for (octave_idx_type i = 0; i < x.numel (); i++) - { - double val = x.xelem (i); - if (octave::math::isnan (val) || octave::math::isinf (val)) - epsval(i) = lo_ieee_nan_value (); - else if (val < std::numeric_limits::min ()) - epsval(i) = std::pow (2.0, -1074e0); - else - { - int exponent; - octave::math::frexp (val, &exponent); - epsval(i) = std::pow (2.0, - static_cast (exponent - 53)); - } - } - + NDArray epsval = eps (arg0.array_value ()); retval = epsval; } }