Ошибка сегментации произошла во время вычисления pi с использованием GMP на Perl

#perl #gmp #pi

#perl #gmp #pi

Вопрос:

Я пытаюсь вычислить pi с использованием GMP на Perl, однако мой код закончился ошибкой сегментации. Что касается того, почему это закончилось ошибкой сегментации, я хотел бы знать.

Я попытался изолировать причину. Похоже, ошибка сегментации произошла, когда был выведен результат вычисления для pi. Конкретный код приведен ниже.

 #!/usr/bin/perl

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

my $n = 100000;
my $i = 1000000;
my $cnv = sub{return mpf(shift, $i);};

my $pi = $cnv->(4.0) * ($cnv->(4.0) * arctan($cnv->(1/5)) - arctan($cnv->(1/239)));

print $pi . "n";

sub arctan{
        my $x = $cnv->(shift);
        my $at = 0;
        $at  = (($_-1)%2==0?1:-1)*($cnv->(1.0)/$cnv->(2*$_ - 1))*$x**(2*$_-1) for (1 .. $n);
        return $at;
}
  

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

1. Как вы установили GMP::Mpf ? Я не смог найти его в metacpan.

2. Я установил его из gmp-6.1.2.tar.lz на gmplib.org . После создания самого GMP и перемещения ./ demos directry я установил GMP.pm , GMP/Mpf.pm и т.д.

3. Я смог установить GMP::Mpf из gmp-6.1.2.tar.lz Ubuntu 18.10, perl 5.29.3. В моей системе, похоже, возникла проблема с arctan функцией. Например say arctan(1.1) зависает, пока я не нажму CTRL-C.

4. Изменение $n со 100_000 на 1000 вычисляется atan(1.1) за 1,3 секунды, для $n = 2000 этого требуется 3,14 секунды. Похоже, что для завершения работы требуется много времени

5. откуда вы взяли эту формулу для pi? обратите внимание, что ваши 1/5 и 1/239 будут неточными (если только GMP ::Mpf действительно не использует какую-то очень глубокую магию), поскольку они вычисляются с использованием обычной perl с плавающей запятой, а не GMP.