我用Python编写了一个程序,旨在找到描述一组数字的公式。无论如何,这个公式适用于较小的数字,“玩得很好”(例如,它会处理[1, 5, 7, 4]
就好了)。但是,当您向它提供任何太大([10, 42, 20, 42, 30, 42]
)时,它会快速抛出异常(RuntimeError: maximum recursion depth exceeded in comparison
)。现在,当我调试这个时,我发现我看到有点有损转换为double(对于这组数字,nval
在第二次迭代时为-611.8000000000000001)。当然,这会让事情变得一团糟,无限地进行。现在,我意识到我的节目可能很糟糕,除了有损转换之外,我也很喜欢你有这方面的任何提示,但有没有人有任何关于解决这个问题的想法?
代码(根据@ 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])
答案 0 :(得分:1)
也许fractions
模块对您有用。它可以精确地表示任何实数,不需要有损转换。我不太明白你的代码在做什么,但我认为你可以通过将import fractions
放在脚本顶部来改变单个现有行来合并分数。在getTerms
内,
terms.append(fval / float(math.factorial(power)))
变为
terms.append(fractions.Fraction(fval,math.factorial(power)))
然后你的程序运行而不会崩溃:
Coeff Power
13/5 5
-139/3 4
932/3 3
-2900/3 2
20576/15 1
-662 0