我用Python編寫了一個程序,該程序旨在查找描述一組數字的公式。無論如何,這個公式可以很好地應用於「玩得很好」的小數字(例如,它會處理[1, 5, 7, 4]
就好)。但是,當您給它過大([10, 42, 20, 42, 30, 42]
)時,它很快會引發異常(RuntimeError: maximum recursion depth exceeded in comparison
)。現在,當我調試這個時,我發現我看到有點有損轉換加倍(對於這組數字,nval
,在第二次迭代中,-611.8000000000000001)。當然,這會使事情全部錯誤並無限遞歸。現在,我意識到我的程序可能是蹩腳的BEYOND BEYOND有損轉換,我也喜歡你有任何提示,但有沒有人有任何想法來解決這個問題?有損轉換問題Python
代碼(按@ jonrsharpe的評論,這是簡單的,因爲我可以把它在不犧牲可讀性):
import math
def getdeg(numlist, cnt):
if allEqual(numlist):
return (0, numlist[0])
count = cnt
templist = []
for i in range(len(numlist) - 1):
templist.append(numlist[i+1] - numlist[i])
count += 1
if not allEqual(templist):
return getdeg(templist, count)
else:
return (count, templist[0])
def allEqual(numlist):
x = len(numlist)
if x == 1:
return True
for i in range(x-1):
if not (numlist[i] == numlist[i+1]):
return False
return True
def getTerms(numlist, terms, maxpower):
newtable = []
power, fval = getdeg(numlist, 0)
if maxpower == 0:
maxpower = power
terms.append(fval/float(math.factorial(power)))
if not power == 0:
for i in range(len(numlist)):
nval = numlist[i] - (terms[maxpower - power] * ((i + 1) ** power))
newtable.append(nval)
return getTerms(newtable, terms, maxpower)
return terms
def printeq(numlist):
#numlist = [2, 8, 9, 11, 20]
print("Coeff\tPower")
x = getTerms(numlist, [], 0)
topPow = len(x) - 1
for i in range(len(x)):
print(str(x[i]) + "\t" + str(topPow))
topPow -= 1
printeq([10, 42, 20, 42, 30, 42])
如果是* 「有點冗長」 *,**你**應該剪下來[最小示例](http://stackoverflow.com/help/mcve)。 – jonrsharpe 2014-11-05 14:28:12
@jonrsharpe好的,我剪出了一個方法,允許您輸入數字,取出註釋,並實現該功能,因此無法工作。你有什麼想法我做錯了嗎?或者你可以改進這個問題? – KnightOfNi 2014-11-05 14:36:04
也許「分數」模塊對你有用。它可以準確地表示任何實數,不需要有損轉換。 – Kevin 2014-11-05 14:44:20