Skip to main content
 首页 » 编程设计

python之二进制搜索平方根 2

2025年05月04日10shanyou

我有一个问题,我的二进制搜索算法找到 2 的平方根似乎处于无限循环中并永远运行:

num = 2 
low = 1 
high = num 
i = 0 
while((i**2) != 2): #was while(low<high): but wasnt working with it either 
 i = low + (high - low) / 2; 
 
 sqrt = i * i 
 
 if (sqrt == num): 
     print(i) 
 elif(sqrt < num): 
     low = i 
 else: 
     high = i 
print(sqrt)     
 
testRoot = 2 ** (.5) 
print(testRoot) 

我不确定我的 while 循环是否有问题。我认为这将是一个非常简单的二进制搜索算法,稍作修改以适应平方根方面。

运行我的代码时,我似乎无法让它产生任何输出。我不确定代码或编译器是否存在真正的问题,因为我认为我遵循的算法与我过去的算法非常接近。

请您参考如下方法:

问题是 using == on floating point numbers几乎总是一种不好的做法,并且有v a r i o u s关于它的问题。您应该将比较替换为 abs(a - b) < precision .还看了这个问题下的评论,很有用。

我修改后的代码看起来像这样(Python 3),替换 1e-6如果您想要更高的精度,请使用较小的数字。但是请注意,“太精确”是不明智的,并且精度为 1.0e-15如果您希望循环停止,建议使用或更大,因为 float 本身有精度限制。

num = 2 
low = 1 
high = num 
i = 0 
while abs((i**2) - num) > 1e-6:  # Note 
    i = low + (high - low) / 2 
    sqrt = i * i 
 
    if abs(sqrt - num) < 1e-6:  # Note 
        print(i) 
    elif(sqrt < num): 
        low = i 
    else: 
        high = i 
print(sqrt) 
 
testRoot = 2 ** (.5) 
print(testRoot)