質問編集履歴
3
追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -60,6 +60,30 @@
|
|
60
60
|
|
61
61
|
###わかったことメモ
|
62
62
|
|
63
|
+
####numpy
|
64
|
+
|
65
|
+
t_obaraさんの回答から。
|
66
|
+
|
67
|
+
代表的な使われ方を想定して場合分けで定義しているんでしょうか。
|
68
|
+
|
69
|
+
```npy_math.h
|
70
|
+
|
71
|
+
#define NPY_PIl 3.141592653589793238462643383279502884L /* pi */
|
72
|
+
|
73
|
+
#define NPY_PI_2l 1.570796326794896619231321691639751442L /* pi/2 */
|
74
|
+
|
75
|
+
#define NPY_PI_4l 0.785398163397448309615660845819875721L /* pi/4 */
|
76
|
+
|
77
|
+
#define NPY_1_PIl 0.318309886183790671537767526745028724L /* 1/pi */
|
78
|
+
|
79
|
+
#define NPY_2_PIl 0.636619772367581343075535053490057448L /* 2/pi */
|
80
|
+
|
81
|
+
```
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
####sympy
|
86
|
+
|
63
87
|
ikapyさんの回答から追加実施
|
64
88
|
|
65
89
|
```python3
|
2
追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -55,3 +55,69 @@
|
|
55
55
|
""")
|
56
56
|
|
57
57
|
```
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
###わかったことメモ
|
62
|
+
|
63
|
+
ikapyさんの回答から追加実施
|
64
|
+
|
65
|
+
```python3
|
66
|
+
|
67
|
+
import math
|
68
|
+
|
69
|
+
import numpy
|
70
|
+
|
71
|
+
import sympy
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
print(math.pi,type(math.pi))
|
76
|
+
|
77
|
+
# 3.141592653589793 <class 'float'>
|
78
|
+
|
79
|
+
print(numpy.pi,type(numpy.pi))
|
80
|
+
|
81
|
+
# 3.141592653589793 <class 'float'>
|
82
|
+
|
83
|
+
print(sympy.pi,int(sympy.pi),float(sympy.pi),type(sympy.pi))
|
84
|
+
|
85
|
+
# pi 3 3.141592653589793 <class 'sympy.core.numbers.Pi'>
|
86
|
+
|
87
|
+
```
|
88
|
+
|
89
|
+
sympyの挙動が面白いのでsympy.core.numbers.Piを見に行ったら、int、float、近似解など要求精度に応じて使い分けているようで。近似解はmpmathモジュールからChudnovskyアルゴリズムを用いているようです。
|
90
|
+
|
91
|
+
```libelefun.py
|
92
|
+
|
93
|
+
def pi_fixed(prec, verbose=False, verbose_base=None):
|
94
|
+
|
95
|
+
"""
|
96
|
+
|
97
|
+
Compute floor(pi * 2**prec) as a big integer.
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
This is done using Chudnovsky's series (see comments in
|
102
|
+
|
103
|
+
libelefun.py for details).
|
104
|
+
|
105
|
+
"""
|
106
|
+
|
107
|
+
# The Chudnovsky series gives 14.18 digits per term
|
108
|
+
|
109
|
+
N = int(prec/3.3219280948/14.181647462 + 2)
|
110
|
+
|
111
|
+
if verbose:
|
112
|
+
|
113
|
+
print("binary splitting with N =", N)
|
114
|
+
|
115
|
+
g, p, q = bs_chudnovsky(0, N, 0, verbose)
|
116
|
+
|
117
|
+
sqrtC = isqrt_fast(CHUD_C<<(2*prec))
|
118
|
+
|
119
|
+
v = p*CHUD_C*sqrtC//((q+CHUD_A*p)*CHUD_D)
|
120
|
+
|
121
|
+
return v
|
122
|
+
|
123
|
+
```
|
1
注記を追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -9,6 +9,8 @@
|
|
9
9
|
誤差の低減とリソース節約の両立をどう工夫しているのかなという、ただの好奇心なのですが。
|
10
10
|
|
11
11
|
ご存じの方、ご教示いただけると幸いです。
|
12
|
+
|
13
|
+
※numpy.piなどのプロパティを定義しているファイルの調べ方でも構いません!
|
12
14
|
|
13
15
|
|
14
16
|
|