C++中开根号需据场景选方法:实数用std::sqrt(需,注意负数检查);整数平方根推荐二分法防浮点误差;复数开方用std::complex+;性能敏感时避免循环内调用并考虑SIMD。
sqrt 函数是 C++ 里最直接的开根号方式
标准库 sqrt 是开平方根的首选,它在 中声明,支持 double、float、long double 三种浮点类型。整数传入会自动转换为 double,但要注意隐式转换可能掩盖精度问题。
常见错误现象:sqrt(-1) 在大多数平台上返回 NaN(非数字),不抛异常;若未检查输入符号就调用,后续计算可能静默出错。
- 必须包含
#include,仅是 C 风格,不推荐 - 对负数开方前务必判断:
if (x -
sqrt(25.0)返回5.0,但sqrt(25)先转成double再算,结果仍是5.0,无精度损失;而sqrt(123456789012345)这类大整数可能因 double 表示范围有限而丢失低比特位
整数开方:用 sqrt + round 还是手写二分?
当需要整数平方根(即 ⌊√n⌋)时,sqrt 配合 static_cast(round(sqrt(n))) 看似方便,但有风险:浮点舍入误差可能导致结果偏移 1。例如某些编译器/平台下 sqrt(25) 可能返回略小于 5.0 的值,floor 后得 4。
更稳妥的做法是用整数二分——尤其在竞赛或嵌入式场景中,避免浮点依赖和不确定舍入。
立即学习“C++免费学习笔记(深入)”;
- 二分范围:左边界 0,右边界取
n或n/2 + 1(因为 √n ≤ n/2 当 n ≥ 4) - 判断条件用
mid 避免mid * mid 溢出(对大int值) - 标准库没有整数版
sqrt,C++20 的也不提供此功能
复数开方要用 std::sqrt 配合 std::complex
对负实数或一般复数开方,不能靠 sqrt(double),必须切换到复数域。C++ 标准库通过 std::complex 和重载的 std::sqrt 支持这一点。