[libmath-prime-util-perl] 149/181: Switch more funcs to long double, and return results as NV
Partha P. Mukherjee
ppm-guest at moszumanska.debian.org
Thu May 21 18:51:16 UTC 2015
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 <dana at 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
More information about the Pkg-perl-cvs-commits
mailing list