有关下面Python代码的说法,错误的是( )。
def sqrt_binary(n, epsilon=1e-10):
if n < 0:
raise ValueError("输入必须为非负整数")
if n == 0 or n == 1:
return n
# 阶段1:
low, high = 1, n
k = 0
while low <= high:
mid = (low + high) // 2
mid_sq = mid * mid
if mid_sq == n:
return mid
elif mid_sq < n:
k = mid
low = mid + 1
else:
high = mid - 1
next_k = k + 1
next_sq = next_k * next_k
if next_sq == n:
return next_k
# 阶段2:
low_float, high_float = float(k), float(k + 1)
while high_float - low_float >= epsilon:
mid = (low_float + high_float) / 2
mid_sq = mid * mid
if mid_sq < n:
low_float = mid
else:
high_float = mid
# 浮点数阶段后的最终结果
result = (low_float + high_float) / 2
check_int = int(result + 0.5)
if check_int * check_int == n:
return check_int
return result
#测试示例
print(sqrt_binary(16)) # 输出: 4
print(sqrt_binary(17)) # 输出: ≈4.123
print(sqrt_binary(10**14)) # 输出: 10000000
“阶段1”的目标是寻找正整数n可能的正完全平方根
“阶段2”的目标是如果正整数n没有正完全平方根,则在可能产生完全平方根附近寻找带小数点的平方根
代码 check_int = int(result + 0.5) 是检查因浮点误差是否为正完全平方根
对巨大数求平方根,本算法同样适用。