[libmath-prime-util-perl] 11/11: Better R accuracy with multiple calls

Partha P. Mukherjee ppm-guest at moszumanska.debian.org
Thu May 21 18:46:12 UTC 2015


This is an automated email from the git hooks/post-receive script.

ppm-guest pushed a commit to annotated tag v0.15
in repository libmath-prime-util-perl.

commit 5eef91677cfcb80cf266d69a35a9e1b483eea899
Author: Dana Jacobsen <dana at acm.org>
Date:   Sun Dec 9 19:21:48 2012 -0800

    Better R accuracy with multiple calls
---
 lib/Math/Prime/Util/ZetaBigFloat.pm | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/lib/Math/Prime/Util/ZetaBigFloat.pm b/lib/Math/Prime/Util/ZetaBigFloat.pm
index 54f036f..505548f 100644
--- a/lib/Math/Prime/Util/ZetaBigFloat.pm
+++ b/lib/Math/Prime/Util/ZetaBigFloat.pm
@@ -197,6 +197,7 @@ my @_Riemann_Zeta_Table = (
 # for k = 1 .. n :  (1 / (zeta(k+1) * k + k)
 # Makes RiemannR run about twice as fast.
 my @_Riemann_Zeta_Premult;
+my $_Riemann_Zeta_Premult_accuracy;
 
 # Select n = 55, good for 46ish digits of accuracy.
 my $_Borwein_n = 55;
@@ -390,9 +391,9 @@ sub RiemannR {
   my $xdigits = $x->accuracy || Math::BigFloat->accuracy() || Math::BigFloat->div_scale();
   my $tol = 0.0 + "1e-$xdigits";
 
-  # TODO: Changing input accuracy may mean we should recalculate this.  Also,
-  # the default table is only 44 digits.
-  if (scalar @_Riemann_Zeta_Premult == 0) {
+  # TODO: The default table is only 44 digits.
+  if ( (scalar @_Riemann_Zeta_Premult == 0) || ($_Riemann_Zeta_Premult_accuracy < $xdigits) ) {
+    $_Riemann_Zeta_Premult_accuracy = $xdigits;
     @_Riemann_Zeta_Premult = map { my $v = Math::BigFloat->bone;
                                    $v->accuracy($xdigits);
                                    $v / ($_Riemann_Zeta_Table[$_-1] * $_ + $_) }
@@ -409,7 +410,8 @@ sub RiemannR {
     if (!defined $zeta_term) {
       my $zeta = $_Riemann_Zeta_Table[$k-1];
       if (!defined $zeta) {
-        my $kz = $k+1;
+        my $kz = Math::BigFloat->new($k+1);
+        $kz->accuracy($xdigits);
         if ($kz >= 100 && $xdigits <= 40) {
           # For this accuracy level, two terms are more than enough.  Also,
           # we should be able to miss the Math::BigFloat accuracy bug.  If we
@@ -424,7 +426,7 @@ sub RiemannR {
     }
     $part_term *= $flogx / $k;
     my $term = $part_term * $zeta_term;
-    #warn "k = $k  term = $term\n";
+    #warn "k = $k  term = $term  sum = $sum\n";
     $sum += $term;
     last if $term < ($tol*$sum);
   }

-- 
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