組合數計算出現浮點誤差的問題python

2021-10-01 06:08:10 字數 974 閱讀 2267

#首先組合數公式c(n,m)可以簡單化簡,例如c(8,5)=c(8,3)=(8*7*6)/(3*2*1),m或n-m為幾,分式上下就有幾

#個數。

def cni(n,i):#原函式

minni = min (i,n-i)#c(8,5)->c(8,3),減少下面迴圈次數

result = 1

for j in range(0,minni):

print('(',result,'*',n -j,')/', minni-j) #除錯

result =result*(n-j)/(minni-j) #從最大項開始累乘

return result

def cni1(n,i):#改正後

minni=min(i,n-i)

result = 1

for j in range(1, minni+1):

print('(',result,'*',n -minni+j,')/', j)#從最小項開始累乘

result = (result * (n -minni+j)) /j#為了保證能夠整除,先進行乘法後除

return result

print('原函式:')

print(cni(8,5),end='\n\n')

print('修改後:')

print(cni1(8,5))

output-----------------------------------------

原函式:

( 1 * 8 )/ 3

( 2.6666666666666665 * 7 )/ 2

( 9.333333333333332 * 6 )/ 1

55.99999999999999

修改後:

( 1 * 6 )/ 1

( 6.0 * 7 )/ 2

( 21.0 * 8 )/ 3

56.0

浮點數精度計算出現的問題

當我們儲存浮點數後再讀取浮點數,結果可能會出現一點點偏差。比如 float ft1 20.2 這樣編譯器會報警告,因為小點數預設為double cstring str str.format t f ft1 這時候ft1的值等於20.200001。float ft2 20.8 cstring str ...

浮點數運算出現誤差的解決方案

直接上 public static void main string args 輸出結果 4.4399999999999995 4.44使用bigdecimal承載資料的型別最好是string型別,否則依然會出現誤差 同時附上加減乘除的方法 public static void main strin...

Java計算出現的問題int超出最大值會怎樣

今天發現我的android應用出現乙個問題,找了好久,現在記錄下來 今天計算是debug除錯出這麼乙個問題 我用簡單的乘法盡然算出了乙個負數,最後發現int的計算超出最大值就變成負數了 currenttimemills 當前時間 正確的寫發應該如下 用long計算 long time current...