sqrt()是C++标准库开平方首选函数,需包含,注意负数返回NaN、整数需转浮点、大整数向下取整应加偏移或用二分法,避免混用pow(x,0.5)。

用 sqrt() 函数最直接
标准库里的 sqrt() 是开平方的首选,定义在 头文件中。它接受 double、float 或 long double,返回同类型结果。
常见错误是忘记包含头文件,或传入负数导致返回 NaN(在非调试模式下可能静默出错):
#include#include int main() { std::cout << sqrt(16.0) << "\n"; // 输出 4 std::cout << sqrt(-4.0) << "\n"; // 输出 -nan 或类似值 }
- 对整数开方,建议显式转成浮点型,如
sqrt(static_cast,避免整型截断或重载歧义(25)) - 若输入可能为负,先检查:
if (x >= 0) result = sqrt(x); else /* 处理错误 */ - 在嵌入式或无浮点支持环境里,
sqrt()可能不可用或极慢
整数开方用 sqrt() 后再取整要小心
想求整数 n 的“向下取整平方根”(即最大整数 k 满足 k*k ),不能简单写 static_cast。
原因:浮点运算存在精度误差,比如 sqrt(1000000000000) 理论上是 1000000,但因舍入可能算成 999999.999999,向下取整就变 999999。
立即学习“C++免费学习笔记(深入)”;
- 安全做法是加一个微小偏移再取整:
static_cast(sqrt(n) + 1e-10) - 更鲁棒的方式是用整数二分法,尤其当
n很大(如接近INT64_MAX)且不允许浮点误差时 -
std::sqrt对int参数不会自动调用整数版本——C++ 没有整数版sqrt重载
不用 怎么办:手写牛顿迭代
在裸机、freestanding 环境,或想控制精度/避免链接数学库时,可用牛顿法迭代求解 x² = a,公式为 x_{n+1} = (x_n + a/x_n) / 2。
它收敛快、不依赖浮点库,但需注意初值和终止条件:
double my_sqrt(double a) {
if (a < 0) return -1.0; // 错误处理
if (a == 0) return 0.0;
double x = a;
while (true) {
double next = (x + a / x) * 0.5;
if (fabs(next - x) < 1e-10) return next;
x = next;
}
}- 初值选
a或a > 1 ? a/2 : 1都可,不影响收敛性 - 用
fabs需要;若彻底禁用,可用(next > x ? next-x : x-next) - 对非常小的
a(如 1e-200),除法可能溢出,应先归一化或设下限
std::sqrt 和 std::pow(x, 0.5) 别混用
虽然 pow(x, 0.5) 数学上等价,但它不是专为开方优化的,性能差、精度低、还可能触发域错误(如 pow(-1, 0.5) 在某些实现中抛异常而非返回 NaN)。
-
sqrt(x)通常编译为单条 CPU 指令(如 x86 的sqrtss),pow是通用幂函数,至少几十倍慢 -
pow接受任意实数指数,内部要做对数+指数运算,中间步骤放大误差 - 即使参数是字面量
0.5,编译器也极少能把pow(x, 0.5)优化成sqrt(x)
浮点开方看似简单,但精度边界、负数处理、整数截断、环境限制这四点,任一疏忽都容易埋下运行时 bug。特别是做算法题或系统编程时,别默认 sqrt 返回“精确整数”。









