Mercurial > octave
diff liboctave/numeric/lo-specfun.cc @ 21231:5f318c8ec634
eliminate feature tests from lo-specfun.h
* lo-specfun.h, lo-specfun.cc (xacosh, xasinh, xatanh, xerf, xerfc
xexpm1, xlog1p, xcbrt): Rename to have 'x' prefix. Conditionally
define in .cc file. Change all uses Move complex versions of acosh,
asinh, and atanh functions here.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Tue, 09 Feb 2016 04:15:50 -0500 |
parents | f7121e111991 |
children | 40de9f8f23a6 |
line wrap: on
line diff
--- a/liboctave/numeric/lo-specfun.cc Tue Feb 09 03:04:09 2016 -0500 +++ b/liboctave/numeric/lo-specfun.cc Tue Feb 09 04:15:50 2016 -0500 @@ -198,128 +198,186 @@ double*, octave_idx_type*, octave_idx_type*); } -#if ! defined (HAVE_ACOSH) double -acosh (double x) +xacosh (double x) { +#if defined (HAVE_ACOSH) + return acosh (x); +#else double retval; F77_XFCN (xdacosh, XDACOSH, (x, retval)); return retval; +#endif } -#endif - -#if ! defined (HAVE_ACOSHF) + float -acoshf (float x) +xacosh (float x) { +#if defined (HAVE_ACOSHF) + return acoshf (x); +#else float retval; F77_XFCN (xacosh, XACOSH, (x, retval)); return retval; +#endif } -#endif - -#if ! defined (HAVE_ASINH) + +Complex +xacosh (const Complex& x) +{ + return log (x + sqrt (x + 1.0) * sqrt (x - 1.0)); +} + +FloatComplex +xacosh (const FloatComplex& x) +{ + return log (x + sqrt (x + 1.0f) * sqrt (x - 1.0f)); +} + double -asinh (double x) +xasinh (double x) { +#if defined (HAVE_ASINH) + return asinh (x); +#else double retval; F77_XFCN (xdasinh, XDASINH, (x, retval)); return retval; +#endif } -#endif - -#if ! defined (HAVE_ASINHF) + float -asinhf (float x) +xasinh (float x) { +#if defined (HAVE_ASINHF) + return asinhf (x); +#else float retval; F77_XFCN (xasinh, XASINH, (x, retval)); return retval; +#endif } -#endif - -#if ! defined (HAVE_ATANH) + +Complex +xasinh (const Complex& x) +{ + return log (x + sqrt (x*x + 1.0)); +} + +FloatComplex +xasinh (const FloatComplex& x) +{ + return log (x + sqrt (x*x + 1.0f)); +} + double -atanh (double x) +xatanh (double x) { +#if defined (HAVE_ATANH) + return atanh (x); +#else double retval; F77_XFCN (xdatanh, XDATANH, (x, retval)); return retval; +#endif } -#endif - -#if ! defined (HAVE_ATANHF) + float -atanhf (float x) +xatanh (float x) { +#if defined (HAVE_ATANHF) + return atanhf (x); +#else float retval; F77_XFCN (xatanh, XATANH, (x, retval)); return retval; +#endif } -#endif - -#if ! defined (HAVE_ERF) + +Complex +xatanh (const Complex& x) +{ + return log ((1.0 + x) / (1.0 - x)) / 2.0; +} + +FloatComplex +xatanh (const FloatComplex& x) +{ + return log ((1.0f + x) / (1.0f - x)) / 2.0f; +} + double -erf (double x) +xerf (double x) { +#if defined (HAVE_ERF) + return erf (x); +#else double retval; F77_XFCN (xderf, XDERF, (x, retval)); return retval; +#endif } -#endif - -#if ! defined (HAVE_ERFF) + float -erff (float x) +xerf (float x) { +#if defined (HAVE_ERFF) + return erff (x); +#else float retval; F77_XFCN (xerf, XERF, (x, retval)); return retval; -} #endif - -#if ! defined (HAVE_ERFC) -double -erfc (double x) -{ - double retval; - F77_XFCN (xderfc, XDERFC, (x, retval)); - return retval; } -#endif - -#if ! defined (HAVE_ERFCF) -float -erfcf (float x) -{ - float retval; - F77_XFCN (xerfc, XERFC, (x, retval)); - return retval; -} -#endif // Complex error function from the Faddeeva package Complex -erf (const Complex& x) +xerf (const Complex& x) { return Faddeeva::erf (x); } + FloatComplex -erf (const FloatComplex& x) +xerf (const FloatComplex& x) { Complex xd (real (x), imag (x)); Complex ret = Faddeeva::erf (xd, std::numeric_limits<float>::epsilon ()); return FloatComplex (real (ret), imag (ret)); } +double +xerfc (double x) +{ +#if defined (HAVE_ERFC) + return erfc (x); +#else + double retval; + F77_XFCN (xderfc, XDERFC, (x, retval)); + return retval; +#endif +} + +float +xerfc (float x) +{ +#if defined (HAVE_ERFCF) + return erfcf (x); +#else + float retval; + F77_XFCN (xerfc, XERFC, (x, retval)); + return retval; +#endif +} + // Complex complementary error function from the Faddeeva package Complex -erfc (const Complex& x) +xerfc (const Complex& x) { return Faddeeva::erfc (x); } + FloatComplex -erfc (const FloatComplex& x) +xerfc (const FloatComplex& x) { Complex xd (real (x), imag (x)); Complex ret = Faddeeva::erfc (xd, std::numeric_limits<float>::epsilon ()); @@ -518,10 +576,12 @@ return result; } -#if ! defined (HAVE_EXPM1) double -expm1 (double x) +xexpm1 (double x) { +#if defined (HAVE_EXPM1) + return expm1 (x); +#else double retval; double ax = fabs (x); @@ -551,18 +611,18 @@ retval = exp (x) - 1; return retval; +#endif } -#endif Complex -expm1 (const Complex& x) +xexpm1 (const Complex& x) { Complex retval; if (std:: abs (x) < 1) { double im = x.imag (); - double u = expm1 (x.real ()); + double u = xexpm1 (x.real ()); double v = sin (im/2); v = -2*v*v; retval = Complex (u*v + u + v, (u+1) * sin (im)); @@ -573,10 +633,12 @@ return retval; } -#if ! defined (HAVE_EXPM1F) float -expm1f (float x) +xexpm1 (float x) { +#if defined (HAVE_EXPM1F) + return expm1f (x); +#else float retval; float ax = fabs (x); @@ -606,18 +668,18 @@ retval = exp (x) - 1; return retval; +#endif } -#endif FloatComplex -expm1 (const FloatComplex& x) +xexpm1 (const FloatComplex& x) { FloatComplex retval; if (std:: abs (x) < 1) { float im = x.imag (); - float u = expm1 (x.real ()); + float u = xexpm1 (x.real ()); float v = sin (im/2); v = -2*v*v; retval = FloatComplex (u*v + u + v, (u+1) * sin (im)); @@ -628,10 +690,12 @@ return retval; } -#if ! defined (HAVE_LOG1P) double -log1p (double x) +xlog1p (double x) { +#if defined (HAVE_LOG1P) + return log1p (x); +#else double retval; double ax = fabs (x); @@ -649,11 +713,11 @@ retval = gnulib::log (1 + x); return retval; +#endif } -#endif Complex -log1p (const Complex& x) +xlog1p (const Complex& x) { Complex retval; @@ -662,7 +726,7 @@ if (fabs (r) < 0.5 && fabs (i) < 0.5) { double u = 2*r + r*r + i*i; - retval = Complex (log1p (u / (1+sqrt (u+1))), + retval = Complex (xlog1p (u / (1+sqrt (u+1))), atan2 (1 + r, i)); } else @@ -671,26 +735,38 @@ return retval; } -#if ! defined (HAVE_CBRT) -double cbrt (double x) +template <typename T> +T +xxcbrt (T x) { - static const double one_third = 0.3333333333333333333; + static const T one_third = 0.3333333333333333333f; if (xfinite (x)) { // Use pow. - double y = std::pow (std::abs (x), one_third) * signum (x); + T y = std::pow (std::abs (x), one_third) * signum (x); // Correct for better accuracy. return (x / (y*y) + y + y) / 3; } else return x; } + +double +xcbrt (double x) +{ +#if defined (HAVE_CBRT) + return cbrt (x); +#else + return xxcbrt (x); #endif - -#if ! defined (HAVE_LOG1PF) +} + float -log1pf (float x) +xlog1p (float x) { +#if defined (HAVE_LOG1PF) + return log1pf (x); +#else float retval; float ax = fabs (x); @@ -708,11 +784,11 @@ retval = gnulib::logf (1.0f + x); return retval; +#endif } -#endif FloatComplex -log1p (const FloatComplex& x) +xlog1p (const FloatComplex& x) { FloatComplex retval; @@ -721,7 +797,7 @@ if (fabs (r) < 0.5 && fabs (i) < 0.5) { float u = 2*r + r*r + i*i; - retval = FloatComplex (log1p (u / (1+sqrt (u+1))), + retval = FloatComplex (xlog1p (u / (1+sqrt (u+1))), atan2 (1 + r, i)); } else @@ -730,21 +806,15 @@ return retval; } -#if ! defined (HAVE_CBRTF) -float cbrtf (float x) +float +xcbrt (float x) { - static const float one_third = 0.3333333333333333333f; - if (xfinite (x)) - { - // Use pow. - float y = std::pow (std::abs (x), one_third) * signum (x); - // Correct for better accuracy. - return (x / (y*y) + y + y) / 3; - } - else - return x; +#if defined (HAVE_CBRTF) + return cbrtf (x); +#else + return xxcbrt (x); +#endif } -#endif static inline Complex zbesj (const Complex& z, double alpha, int kode, octave_idx_type& ierr); @@ -2892,7 +2962,7 @@ const double pi = 3.14159265358979323846; return (x < -1.0 ? Complex (gnulib::log (-(1.0 + x)), pi) - : Complex (log1p (x))); + : Complex (xlog1p (x))); } FloatComplex rc_log1p (float x) @@ -2900,7 +2970,7 @@ const float pi = 3.14159265358979323846f; return (x < -1.0f ? FloatComplex (gnulib::logf (-(1.0f + x)), pi) - : FloatComplex (log1pf (x))); + : FloatComplex (xlog1p (x))); } // This algorithm is due to P. J. Acklam.