在Python中设计Sqrt函数

时间:2017-12-10 18:05:06

标签: python python-3.x

这是一个学术练习。我在Python中实现了sqrt函数。这是我的代码,

def mySqrt(x):
    low, high = 1, x
    while low < high:
        mid = low + (high - low)/2
        if mid * mid > x:
            high = mid - 1
        elif mid * mid < x:
            low = mid
        else:
            return mid
    return low

问题在于,当数字不是完美的正方形时,这不起作用。 我想重新设计这个函数仍然使用log n复杂度,它将sqrt的值返回到指定的小数位数。 所以它就像是,

def sqrt(num, param):
    pass

从而

sqrt(5, 2) = 2.41
sqrt(5, 3) = 2.414 

有人可以帮我解决这个问题。感谢。

3 个答案:

答案 0 :(得分:6)

您可以使用Babylonian method

def sqrt(x):
    n = 1
    for _ in range(10):
        print(n)
        n = (n + x/n) * 0.5

收敛速度非常快。以下是sqrt(2)的示例:

1
1.5
1.41666666667
1.41421568627
1.41421356237
1.41421356237
1.41421356237
1.41421356237
1.41421356237
1.41421356237

代表sqrt(3)

1
2.0
1.75
1.73214285714
1.73205081001
1.73205080757
1.73205080757
1.73205080757
1.73205080757
1.73205080757

现在您只需要用for和精度条件替换while循环并返回结果而不是仅打印它。

答案 1 :(得分:2)

您可以尝试Newton's Method查找平方根

#!/usr/bin/env python
def ntsqrt(n):
    sgn = 0
    if n < 0:
        sgn = -1
        n = -n
    val = n
    while True:
        last = val
        val = (val + n / val) * 0.5
        if abs(val - last) < 1e-9:
            break
    if sgn < 0:
        return complex(0, val)
    return val

if __name__ == "__main__":
    print ntsqrt(25.0)

以上打印成功确切的平方根5.0,每次迭代的值如下:

  5.00000000005

答案 2 :(得分:0)

def sqrt(num, param):
    return float(str(num**0.5)[:param+len(str(num).split("."))+1])

你可以做到1/2的力量