###疑問内容
円周率などの無理数の定数は、一般的な数値解析用モジュール内(math, numpy, sympy, ...)でどう定義されているものなのでしょうか。
近似計算式? それとも十分に長い(倍精度?)数値?
誤差の低減とリソース節約の両立をどう工夫しているのかなという、ただの好奇心なのですが。
ご存じの方、ご教示いただけると幸いです。
※numpy.piなどのプロパティを定義しているファイルの調べ方でも構いません!
###試したこと
具体的にはたとえば、numpy.piなどはどうなっているのかと思って、下記のpyファイルからモジュールの中身を見に行ったのですがpiをどこから引っ張ってきているのか辿ることが出来ませんでした。
python3
1import numpy 2numpy.__file__ 3#'C:\Users\xxx\AppData\Local\Programs\Python\Python37\lib\site-packages\numpy\__init__.py'
constants.pyというファイルも見つけましたが、これはドキュメント用の一般的な説明文だけでした。
constants.py
1add_newdoc('numpy', 'pi', 2 """ 3 ``pi = 3.1415926535897932384626433...`` 4 5 References 6 ---------- 7 https://en.wikipedia.org/wiki/Pi 8 9 """)
###わかったことメモ
####numpy
t_obaraさんの回答から。
代表的な使われ方を想定して場合分けで定義しているんでしょうか。
npy_math.h
1#define NPY_PIl 3.141592653589793238462643383279502884L /* pi */ 2#define NPY_PI_2l 1.570796326794896619231321691639751442L /* pi/2 */ 3#define NPY_PI_4l 0.785398163397448309615660845819875721L /* pi/4 */ 4#define NPY_1_PIl 0.318309886183790671537767526745028724L /* 1/pi */ 5#define NPY_2_PIl 0.636619772367581343075535053490057448L /* 2/pi */
####sympy
ikapyさんの回答から追加実施
python3
1import math 2import numpy 3import sympy 4 5print(math.pi,type(math.pi)) 6# 3.141592653589793 <class 'float'> 7print(numpy.pi,type(numpy.pi)) 8# 3.141592653589793 <class 'float'> 9print(sympy.pi,int(sympy.pi),float(sympy.pi),type(sympy.pi)) 10# pi 3 3.141592653589793 <class 'sympy.core.numbers.Pi'>
sympyの挙動が面白いのでsympy.core.numbers.Piを見に行ったら、int、float、近似解など要求精度に応じて使い分けているようで。近似解はmpmathモジュールからChudnovskyアルゴリズムを用いているようです。
libelefun.py
1def pi_fixed(prec, verbose=False, verbose_base=None): 2 """ 3 Compute floor(pi * 2**prec) as a big integer. 4 5 This is done using Chudnovsky's series (see comments in 6 libelefun.py for details). 7 """ 8 # The Chudnovsky series gives 14.18 digits per term 9 N = int(prec/3.3219280948/14.181647462 + 2) 10 if verbose: 11 print("binary splitting with N =", N) 12 g, p, q = bs_chudnovsky(0, N, 0, verbose) 13 sqrtC = isqrt_fast(CHUD_C<<(2*prec)) 14 v = p*CHUD_C*sqrtC//((q+CHUD_A*p)*CHUD_D) 15 return v
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/27 02:25