comparison liboctave/numeric/lo-specfun.cc @ 18928:161ebb78ac1b

use gnulib::log and gnulib::logf functions * Faddeeva.cc, lo-mappers.cc, lo-specfun.cc: Use gnulib::log and gnulib::logf instead of log and logf.
author John W. Eaton <jwe@octave.org>
date Wed, 16 Jul 2014 19:56:22 -0400
parents 6113e0c6920b
children
comparison
equal deleted inserted replaced
18927:09eb8a2ddb02 18928:161ebb78ac1b
629 s += (t *= u*u) / (i+1); 629 s += (t *= u*u) / (i+1);
630 630
631 retval = 2 * (s + 1) * u; 631 retval = 2 * (s + 1) * u;
632 } 632 }
633 else 633 else
634 retval = log (1 + x); 634 retval = gnulib::log (1 + x);
635 635
636 return retval; 636 return retval;
637 } 637 }
638 #endif 638 #endif
639 639
688 s += (t *= u*u) / (i+1); 688 s += (t *= u*u) / (i+1);
689 689
690 retval = 2 * (s + 1) * u; 690 retval = 2 * (s + 1) * u;
691 } 691 }
692 else 692 else
693 retval = log (1 + x); 693 retval = gnulib::logf (1 + x);
694 694
695 return retval; 695 return retval;
696 } 696 }
697 #endif 697 #endif
698 698
2974 2974
2975 2975
2976 Complex rc_log1p (double x) 2976 Complex rc_log1p (double x)
2977 { 2977 {
2978 const double pi = 3.14159265358979323846; 2978 const double pi = 3.14159265358979323846;
2979 return x < -1.0 ? Complex (log (-(1.0 + x)), pi) : Complex (log1p (x)); 2979 return (x < -1.0
2980 ? Complex (gnulib::log (-(1.0 + x)), pi)
2981 : Complex (log1p (x)));
2980 } 2982 }
2981 2983
2982 FloatComplex rc_log1p (float x) 2984 FloatComplex rc_log1p (float x)
2983 { 2985 {
2984 const float pi = 3.14159265358979323846f; 2986 const float pi = 3.14159265358979323846f;
2985 return x < -1.0f ? FloatComplex (logf (-(1.0f + x)), pi) 2987 return x < -1.0f ? FloatComplex (gnulib::logf (-(1.0f + x)), pi)
2986 : FloatComplex (log1pf (x)); 2988 : FloatComplex (log1pf (x));
2987 } 2989 }
2988 2990
2989 // This algorithm is due to P. J. Acklam. 2991 // This algorithm is due to P. J. Acklam.
2990 // See http://home.online.no/~pjacklam/notes/invnorm/ 2992 // See http://home.online.no/~pjacklam/notes/invnorm/
3034 y = yn / yd; 3036 y = yn / yd;
3035 } 3037 }
3036 else if (ax < 1.0) 3038 else if (ax < 1.0)
3037 { 3039 {
3038 // Tail region. 3040 // Tail region.
3039 const double q = sqrt (-2*log (0.5*(1-ax))); 3041 const double q = sqrt (-2*gnulib::log (0.5*(1-ax)));
3040 const double yn = ((((c[0]*q + c[1])*q + c[2])*q + c[3])*q + c[4])*q + c[5]; 3042 const double yn = ((((c[0]*q + c[1])*q + c[2])*q + c[3])*q + c[4])*q + c[5];
3041 const double yd = (((d[0]*q + d[1])*q + d[2])*q + d[3])*q + 1.0; 3043 const double yd = (((d[0]*q + d[1])*q + d[2])*q + d[3])*q + 1.0;
3042 y = yn / yd * signum (-x); 3044 y = yn / yd * signum (-x);
3043 } 3045 }
3044 else if (ax == 1.0) 3046 else if (ax == 1.0)
3112 y = yn / yd; 3114 y = yn / yd;
3113 } 3115 }
3114 else if (x > 0.0 && x < 2.0) 3116 else if (x > 0.0 && x < 2.0)
3115 { 3117 {
3116 // Tail region. 3118 // Tail region.
3117 const double q = x < 1 ? sqrt (-2*log (0.5*x)) : sqrt (-2*log (0.5*(2-x))); 3119 const double q = x < 1 ? sqrt (-2*gnulib::log (0.5*x)) : sqrt (-2*gnulib::log (0.5*(2-x)));
3118 const double yn = ((((c[0]*q + c[1])*q + c[2])*q + c[3])*q + c[4])*q + c[5]; 3120 const double yn = ((((c[0]*q + c[1])*q + c[2])*q + c[3])*q + c[4])*q + c[5];
3119 const double yd = (((d[0]*q + d[1])*q + d[2])*q + d[3])*q + 1.0; 3121 const double yd = (((d[0]*q + d[1])*q + d[2])*q + d[3])*q + 1.0;
3120 y = yn / yd; 3122 y = yn / yd;
3121 if (x < pbreak_lo) 3123 if (x < pbreak_lo)
3122 y = -y; 3124 y = -y;
3231 value = value + term; 3233 value = value + term;
3232 temp = fabs (term); 3234 temp = fabs (term);
3233 3235
3234 if (temp <= acu && temp <= acu * value) 3236 if (temp <= acu && temp <= acu * value)
3235 { 3237 {
3236 value = value * exp (pp * log (xx) 3238 value = value * exp (pp * gnulib::log (xx)
3237 + (qq - 1.0) * log (cx) - beta) / pp; 3239 + (qq - 1.0) * gnulib::log (cx) - beta) / pp;
3238 3240
3239 if (indx) 3241 if (indx)
3240 { 3242 {
3241 value = 1.0 - value; 3243 value = 1.0 - value;
3242 } 3244 }
3330 indx = false; 3332 indx = false;
3331 } 3333 }
3332 3334
3333 // Calculate the initial approximation. 3335 // Calculate the initial approximation.
3334 3336
3335 r = sqrt (- log (a * a)); 3337 r = sqrt (- gnulib::log (a * a));
3336 3338
3337 ycur = r - (2.30753 + 0.27061 * r) / (1.0 + (0.99229 + 0.04481 * r) * r); 3339 ycur = r - (2.30753 + 0.27061 * r) / (1.0 + (0.99229 + 0.04481 * r) * r);
3338 3340
3339 if (1.0 < pp && 1.0 < qq) 3341 if (1.0 < pp && 1.0 < qq)
3340 { 3342 {
3351 t = 1.0 / (9.0 * qq); 3353 t = 1.0 / (9.0 * qq);
3352 t = r * pow (1.0 - t + ycur * sqrt (t), 3); 3354 t = r * pow (1.0 - t + ycur * sqrt (t), 3);
3353 3355
3354 if (t <= 0.0) 3356 if (t <= 0.0)
3355 { 3357 {
3356 value = 1.0 - exp ((log ((1.0 - a) * qq) + beta) / qq); 3358 value = 1.0 - exp ((gnulib::log ((1.0 - a) * qq) + beta) / qq);
3357 } 3359 }
3358 else 3360 else
3359 { 3361 {
3360 t = (4.0 * pp + r - 2.0) / t; 3362 t = (4.0 * pp + r - 2.0) / t;
3361 3363
3362 if (t <= 1.0) 3364 if (t <= 1.0)
3363 { 3365 {
3364 value = exp ((log (a * pp) + beta) / pp); 3366 value = exp ((gnulib::log (a * pp) + beta) / pp);
3365 } 3367 }
3366 else 3368 else
3367 { 3369 {
3368 value = 1.0 - 2.0 / (t + 1.0); 3370 value = 1.0 - 2.0 / (t + 1.0);
3369 } 3371 }
3401 { 3403 {
3402 return value; 3404 return value;
3403 } 3405 }
3404 3406
3405 xin = value; 3407 xin = value;
3406 ycur = (ycur - a) * exp (beta + r * log (xin) + t * log (1.0 - xin)); 3408 ycur = (ycur - a) * exp (beta + r * gnulib::log (xin)
3409 + t * gnulib::log (1.0 - xin));
3407 3410
3408 if (ycur * yprev <= 0.0) 3411 if (ycur * yprev <= 0.0)
3409 { 3412 {
3410 prev = std::max (sq, fpu); 3413 prev = std::max (sq, fpu);
3411 } 3414 }