背景
开根号(Square Root,√x)是计算机科学中一个极其基础、却又极具深度的问题。
在日常编程中,我们习惯直接调用:
sqrt(x);
但在以下场景中,自己实现 sqrt 算法是必须的:
- 操作系统 / 编译器 / 数学库开发
- 嵌入式系统(无标准库或浮点支持受限)
- 算法竞赛 / 面试(禁止使用库函数)
- 数值计算精度与性能优化
- 底层算法与计算机体系结构学习
很多开发者都会遇到这些问题:
sqrt内部是如何实现的?- 为什么不能直接暴力枚举?
- 浮点数误差如何控制?
- 整数开根号与浮点开根号有何区别?
- 牛顿迭代法为什么这么快?
因此,本项目的目标非常明确:
用 C++ 从零实现多种开根号(sqrt)算法,并系统讲清数学原理、数值特性与工程实现。
需求
本示例程序需要满足以下要求:
1. 功能需求
- 实现整数平方根
- 实现浮点平方根
- 不使用
sqrt()标准库函数 - 输出计算结果用于验证
2. 技术需求
- 使用 标准 C++
- 代码结构清晰、注释详细
- 所有代码放在 单一代码块
3. 算法覆盖
- 二分查找法
- 牛顿迭代法(Newton-Raphson)
- 对比不同方法的优缺点
相关技术
3.1 平方根的数学定义
平方根具有以下特点:
- 仅对 非负数 有实数解
- 单调递增
- 连续函数
3.2 整数平方根 vs 浮点平方根
| 类型 | 说明 |
|---|---|
| 整数平方根 | 返回不超过 √x 的最大整数 |
| 浮点平方根 | 返回近似实数值,允许误差 |
3.3 为什么不能直接枚举?
暴力枚举:
1², 2², 3², 4² ...
- 时间复杂度 O(√n)
- 数值大时效率极低
必须使用对数级算法(O(log n))。
实现思路
本项目采用两种经典算法:
4.1 二分查找法(Binary Search)
核心思想
- √x 一定落在
[0, x]区间 - 利用单调性不断缩小范围
算法流程
left , x
while :
mid ( )
if mid² x → 找到
if mid² x → mid
→ mid

