Python处理大数是否存在精度问题?卡特兰数计算结果偏差排查
卡特兰数求和计算的精度偏差原因分析
你的代码计算卡特兰数乘积的累加和时,输入59出现结果偏差,核心原因是浮点数精度丢失,具体细节如下:
- 浮点数除法引入误差:卡特兰数本身是整数,但你在计算时使用了
/浮点数除法(比如factorial(2*i)/(factorial(i)*factorial(i)))。当n较大时(比如i=59,2i=118的阶乘是超大型整数),float类型的有效位数仅15-17位,无法精确表示这么大的整数,转换为浮点数时会丢失低位信息,导致除法结果出现微小偏差。后续转int()时,这些偏差会被固化,最终累加后形成明显的结果差异。 - 错误的取整时机:你在每一步计算后就用
int()截断,而不是先完成精确的整数运算。卡特兰数的定义C(2n,n)/(n+1)中,组合数C(2n,n)必然能被n+1整除,完全可以用整数除法//完成精确计算,不需要引入浮点数。
修正方案
改用整数运算实现卡特兰数计算,利用Python的大整数特性保证精度,同时直接使用导入的comb函数简化计算:
from math import comb import sys def catalan(n): # 整数除法保证卡特兰数的精确性 return comb(2 * n, n) // (n + 1) total = 0 n = int(sys.stdin.readline()) for i in range(n + 1): total += catalan(i) * catalan(n - i) print(total)
运行修正后的代码,输入59就能得到预期的精确结果。
内容的提问来源于stack exchange,提问作者Alexander Nord
相关产品推荐
相关产品推荐

