Почему выводится неверное значение pi?

#perl #gmp #pi

#perl #gmp #pi

Вопрос:

Я пытаюсь вычислить pi, используя следующий код, который использует алгоритм Чудновского. Когда $ n увеличивается, то количество цифр после десятичной точки. Однако, когда значение $ n мало, выводится правильное значение pi (3.141592 …), но когда значение $ n увеличивается, оно вычисляет неверное значение pi. Почему?

 #!/usr/bin/perl

use strict;
use warnings;
use GMP qw(:all);
use GMP::Mpf qw(:all);
use GMP::Mpz qw(:all);
use GMP::Mpq qw(:all);

my $n = shift; $n = $n<7?7:$n;
$n *= 8;
my $l = int($n/7)   1;

my $fmt = '%.' . $n . 'f';

my ($p0, $q0, $t0) = (1, 1, 0);

$p0 = mpz($p0);
$q0 = mpz($q0);
$t0 = mpz($t0);

my ($p, $q, $t, $a) = (0, 0, 0, 0);

$p = mpz($p);
$q = mpz($q);
$t = mpz($t);
$t = mpz($a);

for my $loop (1 .. $l){
    $p = (2*$loop -1)*(6*$loop -1)*(6*$loop -5);
    $q = ($loop**3)*(640320**3)/24;
    $a = (-1)**$loop   (13591409   545140134*$loop);
    $p *= $p0;
    $q *= $q0;
    $t = $t0*$p   $a*$p;

    $p0 = $p;
    $q0 = $q;
    $t0 = $t;
}

my $x = sr(640320,$n);
$q = mpf($q,$n);
$t = mpf($t,$n);

my $pi = mpf(640320,$n)*sr(mpf(640320,$n),$n)*$q;
$pi /= mpf(12,$n)*($t   mpf(13591409,$n)*$q);

print $pi . "n";

sub sr{
    my ($x,$i) = @_;

    my $s = mpf(0.0,$i);
    my $s0 = mpf($x,$i);

    for (1 .. $n){
        $s = 1/$s0;
        $s *= $x;
        $s0 = ($s   $s0)/mpf(2.0,$i);
    }
    return $s;
}
  

Комментарии:

1. Я протестировал это и могу подтвердить, что это работает только для n=7 и n=8 , когда n значение больше 8, результат не является точным. Однако ваш алгоритм не похож на алгоритм Python .. Вы проверили, верен ли ваш алгоритм?

2. Я считаю, что мой алгоритм правильный, потому что pi выводится правильно, когда $ n меньше 8. Я подозреваю, что не удалось преобразовать mpz в mpf. смотрите ниже. мои $ x = sr (640320, $ n); $ q = mpf ($ q, $ n); $ t = mpf ($ t,$ n);

3. Я подтвердил, что написал неверный алгоритм… Извините.