0

カタロニア語の数字を計算するために、2 つのコードを書きました。1 つ (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]

もう 1 つの (def "catalanFormula") は暗黙の式を適用しますが、n=30 から正確に計算しません。問題は浮動小数点に由来します - k=9 の場合、プログラムは "6835972" の代わりに "6835971.999999999" を返し、この瞬間から最終的な不正解までミスが蓄積されます。

(印刷行は確認用です)

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

丸めを試みて失敗し、10 進インポートを試みましたが、まだ何も正しくありません。

「catalanFormula」が「catalan」として完全に機能する必要があります。何か案は?

ありがとう!

4

2 に答える 2

0

分子と分母を別々に計算し、最後にそれらを割ってみてください。これを行うと、浮動小数点でもう少し遠くにできるはずです。

Pythonには有理数のパッケージがあると確信しています。合理性を使用することは、さらに優れたアイデアです。

于 2012-12-09T11:38:48.943 に答える
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)
于 2012-12-09T11:36:02.840 に答える