复杂计算中的浮点精度

时间:2012-12-09 11:20:00

标签: python floating-point ieee-754 floating-point-precision

为了计算加泰罗尼亚数字,我写了两个代码。一个(def“加泰罗尼亚语”)以递归方式工作并返回正确的加泰罗尼亚语数字。

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”完美地称为“加泰罗尼亚语”; 任何想法?

谢谢!

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

尝试分别计算分子和分母,并在末尾划分它们。如果你这样做,你应该能够使浮点数更远一点。

我确信Python有一个有理数的包。使用理性是一个更好的主意。