计算组合数C(n,i)时避免浮点数精度影响结果的解决方法

Freya ·
更新时间:2024-09-20
· 684 次阅读

def c1 (n,i): minNI = min(i,n-1) result = 1 for j in range (0,minNI): result = result * (n-j)/(minNI-j) return result print ('更改前C(5,3)数值为:',c1(5,3)) print ('更改前C(100,97)数值为:',c1(100,97)) print ('更改前C(100,3)数值为:',c1(100,3)) #例如更改为//后C(5,2)的结果便不等于10 def c2 (n,i): minNI = min(i,n-1) result = 1 for j in range (0,minNI): result = result * (n-j)//(minNI-j)#//取的是最小整数,/得到的是实际结果,然而如改为//会产生更大的误差, return result print ('更改//后C(5,3)数值为:',c1(5,3)) print ('更改//后(100,97)数值为:',c2(100,97)) print ('更改//后(100,3)数值为:',c2(100,3)) #根据数学组合公式应写为如下方式: def jc(a): a1 = a for b in range(1, a): a1 = a1 * (a - b) return a1 def cni(n,i): if(n<i): print("输入错误!n应大于i") return 0 else: result = jc(n)//(jc(i)*jc(n-i))#此时利用//仅取整一次,可以降低很多误差 return result print ('更改算法和//后C(5,3)数值为:',cni(5,3)) print ('更改算法和//后C(100,97)数值为:',cni(100,97)) print ('更改前算法和//C(100,3)数值为:',cni(100,3))
作者:Cola_Dream



精度 方法 浮点数 浮点

需要 登录 后方可回复, 如果你还没有账号请 注册新账号