有损转换Python的麻烦

时间:2014-11-05 14:24:39

标签: python

我用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])

1 个答案:

答案 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