Skip to content

Instantly share code, notes, and snippets.

@xtetsuji
Created July 17, 2017 15:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xtetsuji/ca6881057095de63f80a1af3224ea0b4 to your computer and use it in GitHub Desktop.
Save xtetsuji/ca6881057095de63f80a1af3224ea0b4 to your computer and use it in GitHub Desktop.
Trying sum of Libniz series. It convergence is too late.
#!/usr/bin/perl
use strict;
use warnings;
use Math::Trig qw(pi);
use constant MAX_NUMBER => 100_000;
use constant MAX_NUMBER_LENGTH => length MAX_NUMBER;
my $answer = pi / 4;
printf "π/4 = %f\n", $answer;
my $sum = 0;
for ( my $n = 0; $n <= MAX_NUMBER; $n++ ) {
my $nth_term = (-1)**$n / (2*$n + 1);
$sum += $nth_term;
printf "%" . MAX_NUMBER_LENGTH . "d: sum=%f [term=%f] (delta=%f)\n",
$n, $sum, $nth_term, $answer - $sum
if $n % 10000 == 0;
}
__END__
$ libniz-series.pl
π/4 = 0.785398
0: sum=1.000000 [term=1.000000] (delta=-0.214602)
10000: sum=0.785423 [term=0.000050] (delta=-0.000025)
20000: sum=0.785411 [term=0.000025] (delta=-0.000012)
30000: sum=0.785406 [term=0.000017] (delta=-0.000008)
40000: sum=0.785404 [term=0.000012] (delta=-0.000006)
50000: sum=0.785403 [term=0.000010] (delta=-0.000005)
60000: sum=0.785402 [term=0.000008] (delta=-0.000004)
70000: sum=0.785402 [term=0.000007] (delta=-0.000004)
80000: sum=0.785401 [term=0.000006] (delta=-0.000003)
90000: sum=0.785401 [term=0.000006] (delta=-0.000003)
100000: sum=0.785401 [term=0.000005] (delta=-0.000002)
有効数字を大きくしていないため、小数点第7位以降の端数を加減できていないので、
そこの誤差が大きい。もっと有効数字を大きくする場合には Math::BigFloat や
PPI などの他の数値計算ライブラリで計算を行うと良い。
そうしたとしても、この級数の収束は緩慢である。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment