必须包含头文件并使用std::sqrt;支持多类型重载,负数返回NaN,大整数开方需防浮点误差,推荐整数二分或验证r*r==n。
头文件直接写 sqrt(4.0) 会编译失败,错误通常是 ‘sqrt’ was not declared in this scope。C++ 标准库把数学函数放在 (不是 ),且不自动引入全局命名空间。
正确做法是:
#include#include int main() { double x = 16.0; std::cout << std::sqrt(x) << "\n"; // 推荐显式用 std::sqrt return 0; }
std::sqrt 是标准写法;用 using namespace std; 虽能省略 std::,但易引发命名冲突,不推荐 中的 sqrt 有多个重载:支持 float、double、long double,传入整数(如 int)会隐式转为 double,但结果仍是 double
sqrt(-1.0))在大多数平台返回 NaN,不会抛异常,也不报错——需手动检查输入如果目标是求整数 n 的“向下取整平方根”(比如 sqrt(10) → 3),不能只靠 static_cast,因为浮点计算可能有舍入误差。
例如:std::sqrt(25) + 1e-15 可能被截断为 5,也可能因浮点误差变成 5.000000000000001,再转 int 还是 5;但对大整数(如接近 LLONG_MAX 的完全平方数),误差可能让结果偏小 1。

double 计算,再向零取整后微调n 是 long long 且不能转 double 精确表示时)r = static_cast(std::sqrt(n)); ,再验证 r*r == n || (r+1)*(r+1) == n
std::sqrt 不是唯一选择某些场景下 std::sqrt 并非最优。比如在嵌入式或性能敏感代码中,编译器可能无法内联或优化掉函数调用开销;或者需要处理向量数据。
-O2)后,std::sqrt 通常会被内联并映射到 CPU 的 sqrtss/sqrtsd 指令,效率很高_mm_sqrt_ps),但需手动向量化,且丧失可移植性 和 std::numbers::sqrt2 等常量,但没提供新 sqrt 实现;仍依赖
错误写法包括:#include (C 头文件,不保证 std:: 命名空间)、int y = sqrt(9);(未声明、未包含、未指定命名空间)、sqrt(9.0f) 返回 double 却赋给 float 变量导致隐式降精度。
#include ,而非
sqrt;明确写 std::sqrt
float 得 float,传 double 得 double,传 long double 得 long double;不要假设都是 double
std::isnan() 或 std::isfinite() 检查结果是否有效