首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复杂计算中的浮点精度

复杂计算中的浮点精度
EN

Stack Overflow用户
提问于 2012-12-09 19:20:00
回答 2查看 469关注 0票数 0

为了计算加泰罗尼亚数字,我写了两个代码。One (def " Catalan ")递归工作并返回正确的加泰罗尼亚数字。

代码语言:javascript
复制
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,程序返回"6835972“而不是"6835971.999999999”,并且从这一刻开始累积错误,直到最终的错误答案。

(打印行用于检查)

代码语言:javascript
复制
def catalanFormula(n):
result = 1
for k in range(2, n + 1):
    result *= ((n + k) / k)
    print (result)
return int(result)

我尝试了四舍五入,但失败了,尝试了Decimal导入,但仍然没有得到正确的结果。

我需要"catalanFormula“像”加泰罗尼亚语“一样完美地工作;你有什么想法吗?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2012-12-09 19:36:03

请参阅bigfloat包。

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
BigFloat.exact('3814986502092304.00000000000000000043', precision=113)
票数 0
EN

Stack Overflow用户

发布于 2012-12-09 19:38:49

尝试分别计算分子和分母,并在末尾将它们相除。如果你这样做了,你应该能够用浮点数走得更远一点。

我确信Python有一个用于有理数的包。使用有理数是一个更好的想法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13786927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档