2012-12-09 126 views
0

爲了計算加泰羅尼亞數,我寫了兩個代碼。一個(def「Catalan」)遞歸地工作並返回正確的加泰羅尼亞數字。複雜計算中的浮點精度

dicatalan = {} 
def catalan(n): 
if n == 0: 
    return 1 
else: 
    res = 0 
    if n not in dicatalan: 
     for i in range(n): 
      res += catalan(i) * catalan(n - i - 1) 
     dicatalan[n] = res 
return dicatalan[n] 

另一個(def「catalanFormula」)應用隱式公式,但不從n = 30開始準確計算。問題來自浮點數 - 對於k = 9,程序返回「6835971.999999999」而不是「6835972」,並從此積累錯誤直到最終的錯誤答案。

(印刷線檢查)

def catalanFormula(n): 
result = 1 
for k in range(2, n + 1): 
    result *= ((n + k)/k) 
    print (result) 
return int(result) 

我試圖四捨五入和失敗,嘗試十進制進口,仍然沒有什麼權利。

我需要「catalanFormula」完美地作爲「加泰羅尼亞」; 任何想法?

謝謝!

+0

你能用這個替代的加泰羅尼亞公式:'(2 * n)! /((n + 1)!* n!)'?它應該更精確,因爲術語都可以用整數算術計算,只有一個涉及浮點的最終分割。 – martineau

+0

我必須使用表示的公式......這就是問題 – jizanthapus

+0

你可以在不使用浮點數的情況下離開:在循環的每次迭代的開始或結束時,'(n + 1)* result'是總是一個整數。因此,您可以通過以下方式使用整數:(1)將result'初始化爲'n + 1'而不是'1',(2)用'result = result *(n + k)'替換更新行// k' ,(3)返回'result //(n + 1)'而不是'result'。 –

回答

0

查看bigfloat包。

from bigfloat import * 

setcontext(quadruple_precision) 
def catalanFormula(n): 
    result = BigFloat(1) 
    for k in range(2, n + 1): 
     result *= ((BigFloat(n) + BigFloat(k))/BigFloat(k)) 
    return result 

catalanFormula(30) 

輸出:

BigFloat.exact('3814986502092304.00000000000000000043', precision=113) 
+0

我收到一個錯誤:ImportError:No module named bigfloat – jizanthapus

+0

問題解決了=) – jizanthapus

0

嘗試分別計算的分子和分母,並劃分它們在末端。如果你這樣做,你應該能夠使它與浮點更遠一點。

我相信Python有一個有理數的包。使用理性是一個更好的主意。

+0

親愛的tmyklebu! 我用Fraction包,並解決了這個問題。 謝謝大家! Oren – jizanthapus