https://qiita.com/scivola/items/d4a710cd12d83a2fc15a
を見て、もっと円周率に近い分数が欲しくなった。使い道ないけど。
円周率
Math::PI
は所詮 倍精度浮動小数点数。真の円周率から $1.2×10^{-16}$ ほど乖離している。
真の円周率の代用品をつくる
真の円周率はコンピュータで表現できないので、とりあえず過剰に真の値に近い円周率を出しておく。
数表から引いて 3.1415略r
ととしても良かったんだけど、せっかくなので漸化式で求めておく。
どれでも良かったんだけど、 https://bellard.org/pi/pi_bin.pdf にある (2) の式を使った。こんなやつ。
\pi=\sum_{n=0}^{∞}(\frac{1}{16^{n}}(
\frac{4}{8n+1}
-\frac{2}{8n+4}
-\frac{1}{8n+5}
-\frac{1}{8n+6}
))
で。
できた値を pi.rationalize((1e-20).to_r)
とかすればその精度の有理数が得られる。
ソースコード
というわけで、こんなの書いた。
def fb(n)
# formula(2) in https://bellard.org/pi/pi_bin.pdf
n = n.to_r
[
4r/(8r*n+1),
-2r/(8r*n+4),
-1r/(8r*n+5),
-1r/(8r*n+6),
].sum * 1r/(16r**n)
end
def pi(n)
(0..n).sum{|e| fb(e) }
end
PI = pi(1000)
puts( " value delta value-Math::PI" )
puts( "----------------------------------------- --------- ---------" )
(1..500).map{ |e|
PI.rationalize((0.5**(e/4.0)).to_r)
}.uniq.each do |pi|
real_delta = (pi-PI).to_f
delta_d = (pi-Math::PI.to_r).to_f
s = "%d / %d" % [ pi.numerator, pi.denominator ]
puts( "%41s %+.2e %+.2e" % [ s, real_delta, delta_d ] )
end
実のところ、 PI = pi(1000)
は大いに過剰。 500 で十分。
出力はこんな感じ
value delta value-Math::PI
----------------------------------------- --------- ---------
3 / 1 -1.42e-01 -1.42e-01
13 / 4 +1.08e-01 +1.08e-01
16 / 5 +5.84e-02 +5.84e-02
19 / 6 +2.51e-02 +2.51e-02
22 / 7 +1.26e-03 +1.26e-03
201 / 64 -9.68e-04 -9.68e-04
223 / 71 -7.48e-04 -7.48e-04
245 / 78 -5.67e-04 -5.67e-04
267 / 85 -4.16e-04 -4.16e-04
289 / 92 -2.88e-04 -2.88e-04
311 / 99 -1.79e-04 -1.79e-04
333 / 106 -8.32e-05 -8.32e-05
355 / 113 +2.67e-07 +2.67e-07
55358 / 17621 -2.35e-07 -2.35e-07
59618 / 18977 -2.00e-07 -2.00e-07
63878 / 20333 -1.68e-07 -1.68e-07
68138 / 21689 -1.41e-07 -1.41e-07
72043 / 22932 -1.19e-07 -1.19e-07
75948 / 24175 -9.93e-08 -9.93e-08
79498 / 25305 -8.30e-08 -8.30e-08
82693 / 26322 -6.94e-08 -6.94e-08
85533 / 27226 -5.83e-08 -5.83e-08
88018 / 28017 -4.91e-08 -4.91e-08
90148 / 28695 -4.16e-08 -4.16e-08
92278 / 29373 -3.45e-08 -3.45e-08
94053 / 29938 -2.88e-08 -2.88e-08
95473 / 30390 -2.44e-08 -2.44e-08
96893 / 30842 -2.02e-08 -2.02e-08
97958 / 31181 -1.70e-08 -1.70e-08
99023 / 31520 -1.40e-08 -1.40e-08
99733 / 31746 -1.20e-08 -1.20e-08
100443 / 31972 -1.00e-08 -1.00e-08
101153 / 32198 -8.08e-09 -8.08e-09
101508 / 32311 -7.12e-09 -7.12e-09
101863 / 32424 -6.17e-09 -6.17e-09
102218 / 32537 -5.22e-09 -5.22e-09
102573 / 32650 -4.28e-09 -4.28e-09
102928 / 32763 -3.34e-09 -3.34e-09
103283 / 32876 -2.42e-09 -2.42e-09
103638 / 32989 -1.49e-09 -1.49e-09
103993 / 33102 -5.78e-10 -5.78e-10
104348 / 33215 +3.32e-10 +3.32e-10
208341 / 66317 -1.22e-10 -1.22e-10
312689 / 99532 +2.91e-11 +2.91e-11
833719 / 265381 -8.72e-12 -8.72e-12
1146408 / 364913 +1.61e-12 +1.61e-12
3126535 / 995207 -1.14e-12 -1.14e-12
4272943 / 1360120 -4.04e-13 -4.04e-13
5419351 / 1725033 +2.21e-14 +2.23e-14
47627751 / 15160384 -1.61e-14 -1.60e-14
53047102 / 16885417 -1.22e-14 -1.21e-14
58466453 / 18610450 -9.00e-15 -8.88e-15
63885804 / 20335483 -6.36e-15 -6.24e-15
69305155 / 22060516 -4.13e-15 -4.01e-15
74724506 / 23785549 -2.23e-15 -2.10e-15
80143857 / 25510582 -5.79e-16 -4.57e-16
165707065 / 52746197 +1.64e-16 +2.87e-16
245850922 / 78256779 -7.82e-17 +4.43e-17
411557987 / 131002976 +1.94e-17 +1.42e-16
1068966896 / 340262731 -3.07e-18 +1.19e-16
2549491779 / 811528438 +5.51e-19 +1.23e-16
6167950454 / 1963319607 -7.63e-20 +1.22e-16
14885392687 / 4738167652 +3.12e-20 +1.22e-16
21053343141 / 6701487259 -2.62e-22 +1.22e-16
920179147750 / 292902119789 +2.48e-22 +1.22e-16
1004392520314 / 319708068825 +2.05e-22 +1.22e-16
1067552549737 / 339812530602 +1.77e-22 +1.22e-16
1151765922301 / 366618479638 +1.45e-22 +1.22e-16
1214925951724 / 386722941415 +1.24e-22 +1.22e-16
1278085981147 / 406827403192 +1.05e-22 +1.22e-16
1341246010570 / 426931864969 +8.79e-23 +1.22e-16
1404406039993 / 447036326746 +7.22e-23 +1.22e-16
1446512726275 / 460439301264 +6.24e-23 +1.22e-16
1509672755698 / 480543763041 +4.89e-23 +1.22e-16
1551779441980 / 493946737559 +4.05e-23 +1.22e-16
1572832785121 / 500648224818 +3.64e-23 +1.22e-16
1614939471403 / 514051199336 +2.86e-23 +1.22e-16
1635992814544 / 520752686595 +2.49e-23 +1.22e-16
1657046157685 / 527454173854 +2.13e-23 +1.22e-16
1678099500826 / 534155661113 +1.77e-23 +1.22e-16
1699152843967 / 540857148372 +1.43e-23 +1.22e-16
1720206187108 / 547558635631 +1.09e-23 +1.22e-16
1741259530249 / 554260122890 +7.58e-24 +1.22e-16
1762312873390 / 560961610149 +4.37e-24 +1.22e-16
1783366216531 / 567663097408 +1.23e-24 +1.22e-16
3587785776203 / 1142027682075 -3.15e-25 +1.22e-16
5371151992734 / 1709690779483 +1.97e-25 +1.22e-16
8958937768937 / 2851718461558 -7.72e-27 +1.22e-16
77042654144230 / 24523438471947 +6.58e-27 +1.22e-16
86001591913167 / 27375156933505 +5.09e-27 +1.22e-16
94960529682104 / 30226875395063 +3.88e-27 +1.22e-16
103919467451041 / 33078593856621 +2.88e-27 +1.22e-16
112878405219978 / 35930312318179 +2.04e-27 +1.22e-16
121837342988915 / 38782030779737 +1.32e-27 +1.22e-16
130796280757852 / 41633749241295 +7.01e-28 +1.22e-16
139755218526789 / 44485467702853 +1.61e-28 +1.22e-16
288469374822515 / 91822653867264 -8.37e-29 +1.22e-16
428224593349304 / 136308121570117 -3.81e-30 +1.22e-16
3137327371971917 / 998642318693672 +3.54e-30 +1.22e-16
3565551965321221 / 1134950440263789 +2.66e-30 +1.22e-16
3993776558670525 / 1271258561833906 +1.97e-30 +1.22e-16
4422001152019829 / 1407566683404023 +1.41e-30 +1.22e-16
4850225745369133 / 1543874804974140 +9.46e-31 +1.22e-16
5278450338718437 / 1680182926544257 +5.61e-31 +1.22e-16
5706674932067741 / 1816491048114374 +2.33e-31 +1.22e-16
6134899525417045 / 1952799169684491 -4.86e-32 +1.22e-16
17976473982901831 / 5722089387483356 +4.09e-32 +1.22e-16
24111373508318876 / 7674888557167847 +1.81e-32 +1.22e-16
30246273033735921 / 9627687726852338 +4.56e-33 +1.22e-16
66627445592888887 / 21208174623389167 -3.36e-34 +1.22e-16
230128609812402582 / 73252211597019839 +3.08e-34 +1.22e-16
296756055405291469 / 94460386220409006 +1.63e-34 +1.22e-16
363383500998180356 / 115668560843798173 +7.18e-35 +1.22e-16
430010946591069243 / 136876735467187340 +8.66e-36 +1.22e-16
1356660285366096616 / 431838381024951187 -8.26e-36 +1.22e-16
1786671231957165859 / 568715116492138527 -4.19e-36 +1.22e-16
2216682178548235102 / 705591851959325867 -1.70e-36 +1.22e-16
2646693125139304345 / 842468587426513207 -1.41e-38 +1.22e-16
たとえば。
誤差が $10^{-20}$ 以下の円周率がほしければ、 21053343141r / 6701487259
を使えばいい。
桁数の割に精度が高い有理数
ちなみに。
見つけた範囲内で、桁数の割に精度が高い有理数 ベスト5 は、以下の通り:
# | 値 | 誤差 | log10(誤差)+log10(分母×分子) |
---|---|---|---|
1 | 355/113 | +2.67e-07 | -1.971 |
2 | 2646693125139304345/842468587426513207 | -1.41e-38 | -1.502 |
3 | 21053343141/6701487259 | -2.62e-22 | -1.433 |
4 | 22/7 | +1.26e-03 | -0.711 |
5 | 8958937768937/2851718461558 | -7.72e-27 | -0.705 |
有名有理数の強さが光るね。