質問編集履歴

3

追記

2020/08/27 02:27

投稿

jeanbiego
jeanbiego

スコア3966

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

追記

2020/08/27 02:27

投稿

jeanbiego
jeanbiego

スコア3966

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

注記を追加

2020/08/27 02:20

投稿

jeanbiego
jeanbiego

スコア3966

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