在python中用一个分数逼近一个实数

时间:2013-12-15 16:22:53

标签: 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]

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))

1 个答案:

答案 0 :(得分:0)

您的计划中有多处错误。首先,表达式10^(-3)不会评估为0.001。 ^用于两个整数之间的异或操作。 Python使用**进行求幂。

其次,看起来你正在使用Python 2.x. Python 2.x默认使用整数除法。所以3/2返回1而不是1.5。 Python 3.x更改行为以返回浮动。使用Python 2.x,您需要将每个分区的一个操作数转换为float或使用from __future__ import division将Python 3.x样式分区与Python 2.x一起使用。

if (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))