上午好☀️☀️☀️️
本答案参考通义千问
好的,下面我将根据你的要求,详细设计一个使用二分法计算实数平方根的函数 sqrt_binary(n),并满足以下条件:
- 输入为一个浮点数
n 和一个精度值(如 1e-7); - 输出保留 8位小数;
- 使用二分法在区间
[0, n + 0.25] 内搜索; - 当
abs(x * x - n) <= 精度 时停止迭代。
✅ 任务目标
编写一个 Python 函数 sqrt_binary(n),使用二分法计算实数 n 的平方根,满足上述条件,并输出结果。
🧠 解题思路
1. 输入处理
- 用户在同一行内输入两个值,用逗号分隔;
- 需要解析这两个值:一个是
n,一个是精度;
2. 初始化参数
- 设置初始范围:
low = 0, high = n + 0.25; - 设置精度阈值:
epsilon = precision;
3. 二分查找算法
- 在
low 和 high 之间不断取中点 mid; - 比较
mid * mid 与 n 的差值是否小于等于 epsilon; - 若是,则返回
mid; - 否则,调整
low 或 high;
4. 输出格式控制
- 使用
round() 或字符串格式化保留 8位小数; - 注意:Python 中
round() 有时会四舍五入不准确,建议使用 format() 或 f-string;
🔧 实现代码
import math
def sqrt_binary(n, precision):
low = 0.0
high = n + 0.25
epsilon = precision
while high - low > epsilon:
mid = (low + high) / 2
if mid * mid < n:
low = mid
else:
high = mid
return round(mid, 8) # 保留8位小数
# 主程序
if __name__ == "__main__":
input_line = input("请输入 n 和精度(用逗号分隔): ")
n_str, precision_str = input_line.split(',')
n = float(n_str)
precision = float(precision_str)
result_binary = sqrt_binary(n, precision)
result_math = math.sqrt(n)
print(f"{result_binary:.8f}")
print(f"{result_math:.8f}")
⚙️ 示例运行
输入:
5.0,1e-7
输出:
2.23606796
2.23606798
📌 重点说明
✅ 关键点总结
-
输入格式处理
- 使用
split(',') 分割输入; - 转换为
float 类型;
-
二分法逻辑
- 初始区间
[0, n+0.25] 是合理的,避免了 n=0 时的问题; - 循环条件为
high - low > epsilon,确保精度;
-
输出格式
- 使用
print(f"{x:.8f}") 保证保留 8位小数; - 与
math.sqrt() 对比,验证正确性;
🛠️ 优化建议
- 如果需要更高的精度或更快速的收敛,可以考虑使用牛顿迭代法;
- 对于非常大的
n,可以动态调整初始范围(如 high = max(1, n + 0.25));
📝 最终答案
以下是完整的 Python 代码,用于实现你描述的功能:
import math
def sqrt_binary(n, precision):
low = 0.0
high = n + 0.25
epsilon = precision
while high - low > epsilon:
mid = (low + high) / 2
if mid * mid < n:
low = mid
else:
high = mid
return round(mid, 8)
if __name__ == "__main__":
input_line = input("请输入 n 和精度(用逗号分隔): ")
n_str, precision_str = input_line.split(',')
n = float(n_str)
precision = float(precision_str)
result_binary = sqrt_binary(n, precision)
result_math = math.sqrt(n)
print(f"{result_binary:.8f}")
print(f"{result_math:.8f}")
如有其他问题,欢迎继续提问!