import numpy as np
def bin_search_sqrt(num):

    left, right = 0, num
    while right - left > 1:
        mid = (left + right) // 2
        if mid ** 2 > num:
            right = mid
        else:
            left = mid
    return right if right**2 - num < num - left**2 else left

for i in range(15, 37):
    print(i,bin_search_sqrt(i),np.sqrt(i))

输出:

16 4 4.0
17 4 4.12310562562
18 4 4.24264068712
19 4 4.35889894354
20 4 4.472135955
21 5 4.58257569496
22 5 4.69041575982
23 5 4.79583152331
24 5 4.89897948557
25 5 5.0
26 5 5.09901951359
27 5 5.19615242271
28 5 5.29150262213
29 5 5.38516480713
30 5 5.47722557505
31 6 5.56776436283
32 6 5.65685424949
33 6 5.74456264654
34 6 5.83095189485
35 6 5.9160797831
36 6 6.0

看上去好像是可以的?