我試圖使用 python 來通過遵循 stern brocot 樹來確定 pi 的連分數。很簡單,如果我對pi的估計太高,就往左走,如果我對pi的估計太低,就往右走。
我mpmath用來獲得任意精度的浮點數,因為 python 不支持,但無論我將小數精度設定為使用“mp.dps”,連分數生成似乎一旦命中就停止245850922/78256779。
理論上,它應該只在等于當前對 pi 的估計時才退出執行。所以我嘗試增加 的小數精度mp.dps,但它仍然在那里停止執行。
我是否達到了最大精度,mp.dps或者我的方法效率低下?我怎樣才能使連分數生成不停止在245850922/78256779???
import mpmath as mp
mp.dps = 1000
def eval_stern_seq(seq):
a,b,c,d,m,n=0,1,1,0,1,1
for i in seq:
if i=='L':
c,d=m,n
else:
a,b=m,n
m,n=a c,b d
return m,n
seq = ''
while True:
stern_frac = eval_stern_seq(seq)
print(f"\n\ncurrent fraction: {stern_frac[0]}/{stern_frac[1]}")
print("current value: " mp.nstr(mp.fdiv(stern_frac[0],stern_frac[1]),n=mp.dps))
print("pi (reference): " mp.nstr(mp.pi,n=mp.dps))
if mp.fdiv(stern_frac[0],stern_frac[1]) > mp.pi:
seq ='L'
elif mp.fdiv(stern_frac[0],stern_frac[1]) < mp.pi:
seq ='R'
else:
break
input("\n\t(press enter to continue generation...)")
uj5u.com熱心網友回復:
您需要在每個 fdiv 操作中包含術語 prec=xxxxx,例如:mp.fdiv(stern_frac[0],stern_frac[1])變成mp.fdiv(stern_frac[0],stern_frac[1], prec=200)
uj5u.com熱心網友回復:
你需要from mpmath import mp,不是import mpmath as mp。(或者你可以import mpmath然后使用mpmath.mp.dps = ...)。有關其他資訊,請參閱檔案。
from mpmath import mp
mp.dps = 1000
def eval_stern_seq(seq):
a, b, c, d, m, n = 0, 1, 1, 0, 1, 1
for i in seq:
if i == 'L':
c, d = m, n
else:
a, b = m, n
m, n = a c, b d
return m, n
seq = ''
for _ in range(1000):
stern_frac = eval_stern_seq(seq)
print(f"{stern_frac[0]}/{stern_frac[1]}")
if mp.fdiv(stern_frac[0], stern_frac[1]) > mp.pi:
seq = 'L'
elif mp.fdiv(stern_frac[0], stern_frac[1]) < mp.pi:
seq = 'R'
else:
break
輸出:
...
2810940413396914412349044750336209104844394887546/894750123057789325577450189803726071898054047077
2936686853946948334940603569095291581361715769163/934776458237287423525876798002671462625917371175
3062433294496982257532162387854374057879036650780/974802793416785521474303406201616853353780695273
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/364974.html
上一篇:買x送y公式
