python中用分数逼近实数

python中用分数逼近实数,python,Python,我正试图用Python编写一个程序,将一个实数近似为精度为10^-3的分数。这就是我所做的,我不知道怎么了。有人能帮我吗? 我使用发条装置。有人能告诉我有什么问题吗?提前谢谢 from math import * def restriction(x,a,b,c,d): if x<(a+b)/(c+d): return [x,a,b,a+c,b+d] if x>(a+b)/(c+d): return [x,a+c,b+d,c,d]

我正试图用Python编写一个程序,将一个实数近似为精度为10^-3的分数。这就是我所做的,我不知道怎么了。有人能帮我吗? 我使用发条装置。有人能告诉我有什么问题吗?提前谢谢

from math import *

def restriction(x,a,b,c,d):

    if x<(a+b)/(c+d):
        return [x,a,b,a+c,b+d]
    if x>(a+b)/(c+d):
        return [x,a+c,b+d,c,d]

def cancres(x,a,b,c,d,prec):

    if x==a/b or x==c/d:
        return x
    elif x<a/b or x>c/d:
        return False
    else:
        w=restriction(x,a,b,c,d)
        i=0
        if (w[3]/w[4]-w[2]/w[1])>prec:
            w=restriction(x,w[1],w[2],w[3],w[4])
            print w
            i+=1
    return w

print cancres(sqrt(3),3,2,2,1,10^(-3))

您的程序中有几个错误。首先,表达式10^-3的计算结果不是0.001。^用于两个整数之间的异或逐位运算。Python使用**进行求幂运算

其次,看起来您正在使用Python2.x。Python2.x默认使用整数除法。所以3/2返回1,而不是1.5。Python3.x更改行为以返回浮点。对于Python2.x,您需要将每个除法的一个操作数转换为浮点,或者使用from _ufuture _uuimport除法将Python3.x样式的除法用于Python2.x

如果w[3]/w[4]-w[2]/w[1]>prec:的行有三个错误。它应该是w[4]/w[3],而不是w[3]/w[4]。在与prec进行比较之前,需要取绝对值。您正在尝试执行重复循环,因此应该使用while而不是if

还有一些其他的设计和风格问题,我没有解决,但代码似乎是可行的

from __future__ import division
from math import *

def restriction(x,a,b,c,d):

    if x<(a+b)/(c+d):
        return [x,a,b,a+c,b+d]
    if x>(a+b)/(c+d):
        return [x,a+c,b+d,c,d]

def cancres(x,a,b,c,d,prec):

    if x==a/b or x==c/d:
        return x
    elif x<a/b or x>c/d:
        return False
    else:
        w=restriction(x,a,b,c,d)
        i=0
        while (abs(w[4]/w[3]-w[2]/w[1]))>prec:
            w=restriction(x,w[1],w[2],w[3],w[4])
            print w
            i+=1
    return w

print cancres(sqrt(3),3,2,2,1,10**(-3))

嗯,怎么了?^不做指数运算。尝试将10^-3替换为10**-3。它只是找不到分数。我想这可能是因为计算中的类型错误。它不是重复的,我不只是想使用python命令进行近似,我想测试我的算法。谢谢你的时间。这是一个非常奇怪的函数。它可以返回浮点返回x、布尔返回False或四个浮点返回w的列表。其中似乎没有一个是两个整数的比率。当它甚至不清楚应该返回什么时,也没有办法告诉它为什么不工作。我认为1E-3比10**-3更清晰,更容易输入。谢谢!我不知道Python3和Python2之间的事情。。。