This is an automated email from the git hooks/post-receive script. ppm-guest pushed a commit to annotated tag v0.36 in repository libmath-prime-util-perl.
commit 209e98f1599fe48e9d1846d8e381af133df6ab8c Author: Dana Jacobsen <d...@acm.org> Date: Thu Jan 9 01:13:29 2014 -0800 Switch more funcs to long double, and return results as NV --- XS.xs | 12 ++++++------ util.c | 36 ++++++++++++++++++++---------------- util.h | 4 ++-- 3 files changed, 28 insertions(+), 24 deletions(-) diff --git a/XS.xs b/XS.xs index 598d390..2e84948 100644 --- a/XS.xs +++ b/XS.xs @@ -726,18 +726,18 @@ _XS_ExponentialIntegral(IN SV* x) if (ix < 4) { NV nv = SvNV(x); switch (ix) { - case 0: ret = (double) _XS_ExponentialIntegral(nv); break; - case 1: ret = (double) _XS_LogarithmicIntegral(nv); break; - case 2: ret = (double) ld_riemann_zeta(nv); break; + case 0: ret = (NV) _XS_ExponentialIntegral(nv); break; + case 1: ret = (NV) _XS_LogarithmicIntegral(nv); break; + case 2: ret = (NV) ld_riemann_zeta(nv); break; case 3: - default:ret = (double) _XS_RiemannR(nv); break; + default:ret = (NV) _XS_RiemannR(nv); break; } } else { UV uv = SvUV(x); switch (ix) { - case 4: ret = _XS_chebyshev_theta(uv); break; + case 4: ret = (NV) _XS_chebyshev_theta(uv); break; case 5: - default:ret = _XS_chebyshev_psi(uv); break; + default:ret = (NV) _XS_chebyshev_psi(uv); break; } } RETVAL = ret; diff --git a/util.c b/util.c index fef4157..ab7291c 100644 --- a/util.c +++ b/util.c @@ -37,10 +37,17 @@ #define floorl(x) (long double) floor( (double) (x) ) #endif -#ifndef INFINITY +#ifdef LDBL_INFINITY + #undef INFINITY + #define INFINITY LDBL_INFINITY +#elif !defined(INFINITY) #define INFINITY (DBL_MAX + DBL_MAX) #endif +#ifndef LDBL_EPSILON + #define LDBL_EPSILON 1e-16 +#endif + #define KAHAN_INIT(s) \ long double s ## _y, s ## _t; \ long double s ## _c = 0.0; \ @@ -1068,7 +1075,7 @@ UV znlog(UV a, UV g, UV p) { return 0; } -double _XS_chebyshev_theta(UV n) +long double _XS_chebyshev_theta(UV n) { KAHAN_INIT(sum); @@ -1091,9 +1098,9 @@ double _XS_chebyshev_theta(UV n) } end_segment_primes(ctx); } - return (double) sum; + return sum; } -double _XS_chebyshev_psi(UV n) +long double _XS_chebyshev_psi(UV n) { long double logn = logl(n); UV sqrtn = isqrt(n); @@ -1124,7 +1131,7 @@ double _XS_chebyshev_psi(UV n) } end_segment_primes(ctx); } - return (double) sum; + return sum; } @@ -1153,7 +1160,6 @@ static long double const euler_mascheroni = 0.5772156649015328606065120900824024 static long double const li2 = 1.045163780117492784844588889194613136522615578151L; long double _XS_ExponentialIntegral(long double x) { - long double const tol = 1e-17; long double val, term; unsigned int n; KAHAN_INIT(sum); @@ -1173,7 +1179,7 @@ long double _XS_ExponentialIntegral(long double x) { ld = 1.0L / (t - n2 * ld); old = val; val *= ld/lc; - if ( fabsl(val-old) <= tol*fabsl(val) ) + if ( fabsl(val-old) <= LDBL_EPSILON*fabsl(val) ) break; } } else if (x < 0) { @@ -1195,7 +1201,7 @@ long double _XS_ExponentialIntegral(long double x) { long double sumn = C6p[0]-x*(C6p[1]-x*(C6p[2]-x*(C6p[3]-x*(C6p[4]-x*(C6p[5]-x*C6p[6]))))); long double sumd = C6q[0]-x*(C6q[1]-x*(C6q[2]-x*(C6q[3]-x*(C6q[4]-x*(C6q[5]-x*C6q[6]))))); val = logl(-x) - sumn/sumd; - } else if (x < -logl(tol)) { + } else if (x < -logl(LDBL_EPSILON)) { /* Convergent series */ long double fact_n = x; for (n = 2; n <= 200; n++) { @@ -1204,7 +1210,7 @@ long double _XS_ExponentialIntegral(long double x) { term = fact_n * invn; KAHAN_SUM(sum, term); /* printf("C after adding %.8lf, val = %.8lf\n", term, sum); */ - if ( term < tol*sum) break; + if ( term < LDBL_EPSILON*sum) break; } KAHAN_SUM(sum, euler_mascheroni); KAHAN_SUM(sum, logl(x)); @@ -1217,7 +1223,7 @@ long double _XS_ExponentialIntegral(long double x) { for (n = 1; n <= 200; n++) { long double last_term = term; term = term * ( (long double)n * invx ); - if (term < tol*sum) break; + if (term < LDBL_EPSILON*sum) break; if (term < last_term) { KAHAN_SUM(sum, term); /* printf("A after adding %.20llf, sum = %.20llf\n", term, sum); */ @@ -1324,7 +1330,6 @@ static const long double riemann_zeta_table[] = { * we had quad floats, we could use the 9-term polynomial. */ long double ld_riemann_zeta(long double x) { - long double const tol = 1e-17; int i; if (x < 0) croak("Invalid input to RiemannZeta: x must be >= 0"); @@ -1376,7 +1381,7 @@ long double ld_riemann_zeta(long double x) { for (i = 5; i <= 1000000; i++) { long double term = powl(i, -x); KAHAN_SUM(sum, term); - if (term < tol*sum) break; + if (term < LDBL_EPSILON*sum) break; } KAHAN_SUM(sum, powl(4, -x) ); KAHAN_SUM(sum, powl(3, -x) ); @@ -1410,7 +1415,7 @@ long double ld_riemann_zeta(long double x) { for (i = 2; i < 11; i++) { b = powl( i, -x ); s += b; - if (fabsl(b/s) < tol) + if (fabsl(b/s) < LDBL_EPSILON) return s; } s = s + b*w/(x-1.0) - 0.5 * b; @@ -1422,7 +1427,7 @@ long double ld_riemann_zeta(long double x) { t = a*b/A[i]; s = s + t; t = fabsl(t/s); - if (t < tol) + if (t < LDBL_EPSILON) break; a *= x + k + 1.0; b /= w; @@ -1432,7 +1437,6 @@ long double ld_riemann_zeta(long double x) { } long double _XS_RiemannR(long double x) { - long double const tol = 1e-17; long double part_term, term, flogx; unsigned int k; KAHAN_INIT(sum); @@ -1449,7 +1453,7 @@ long double _XS_RiemannR(long double x) { term = part_term / (k + k * ld_riemann_zeta(k+1)); KAHAN_SUM(sum, term); /* printf("R after adding %.15lg, sum = %.15lg\n", term, sum); */ - if (fabsl(term/sum) < tol) break; + if (fabsl(term/sum) < LDBL_EPSILON) break; } return sum; diff --git a/util.h b/util.h index e0e6b8c..59743fe 100644 --- a/util.h +++ b/util.h @@ -18,8 +18,8 @@ extern UV _XS_nth_prime(UV x); extern signed char* _moebius_range(UV low, UV high); extern UV* _totient_range(UV low, UV high); extern IV mertens(UV n); -extern double _XS_chebyshev_theta(UV n); -extern double _XS_chebyshev_psi(UV n); +extern long double _XS_chebyshev_theta(UV n); +extern long double _XS_chebyshev_psi(UV n); extern long double _XS_ExponentialIntegral(long double x); extern long double _XS_LogarithmicIntegral(long double x); -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libmath-prime-util-perl.git _______________________________________________ Pkg-perl-cvs-commits mailing list Pkg-perl-cvs-commits@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-perl-cvs-commits