我正在尝试使用Ramanujan 算法来近似 pi :
它应该计算总和,直到最后一个总和小于1e-15
。
这应该是为了好玩,最多占用我半个小时的时间……但我的代码没有产生任何接近 pi 的东西,我不知道为什么。很可能我忽略了一些愚蠢的事情,但不确定!
请注意:我从$k
1 开始,因为 0 打破了我的factorial
sub 并且从我的计算 k=0 无论如何都会返回 0。
我意识到可以更有效地编写代码;我尽可能简单地把它写出来,看看我是否能理解我哪里出错了。任何帮助表示赞赏!
#!/usr/bin/perl
use warnings;
use strict;
sub approx_pi {
my $const = (2 * sqrt(2)) / 9801;
my $k = 1;
my $sum = 0;
while ($sum < 1e-15) {
my $p1 = factorial((4 * $k), 1);
my $p2 = 1103 + (26390 * $k);
my $p3 = (factorial($k, 1))**4;
my $p4 = 396**(4 * $k);
$sum = $sum + ( ($p1 * $p2) / ($p3 * $p4) );
$k++;
}
#print "Const: $const\nSum: $sum\n";
return (1 / ($const * $sum));
}
sub factorial {
my ($i, $total) = @_;
return $total if $i == 1;
$total = $total * $i;
#print "i: $i total: $total\n";
factorial($i-1, $total);
}
my $pi = approx_pi();
print "my pi is: $pi\n";