sqrt函数需包含头文件,仅支持浮点类型,负数返回NaN,整数开方应避免(int)sqrt(n)而用round后转换,Linux链接需-lm。
头文件直接写 sqrt(4.0) 却没加头文件,编译器会报 error: 'sqrt' was not declared in this scope。C++ 标准库中数学函数全在 里,不是 (那是 C 风格,虽部分编译器兼容但不推荐)。using namespace std; 不是必需的,但调用时得写成 std::sqrt 或提前声明。
sqrt 的重载版本只支持 double、float、long double,没有 int 版本。传入整数如 sqrt(9) 会触发 int → double 隐式转换,结果正确;但若变量是 int x = -1; 再调用 sqrt(x),运行时会返回 nan(非数字),且不报错——这是常见静默陷阱。
if (x >= 0) result = sqrt(x); el
se /* handle error */
(int)sqrt(n),浮点精度可能导致 sqrt(25) == 4.9999999,转成 int 后变 4。应改用 static_cast(round(sqrt(n))) 或更稳妥的整数二分法现代 x86 CPU 通常有硬件 sqrtss/sqrtsd 指令,std::sqrt 一般直接映射过去,速度很快。但某些嵌入式平台或开启 -ffast-math 时,编译器可能用牛顿迭代近似替代,精度下降。实测中:
double 调用 sqrt 比手写 pow(x, 0.5) 快 3–5 倍,且更准sqrtf(x)(单精度版)比 sqrt(x) 略快,但仅当全程用 float 且精度允许时才值得切换Linux 下用 g++ 编译含 sqrt 的程序,偶尔会遇到 undefined reference to `sqrt'。这不是头文件问题,而是链接阶段缺失数学库。解决方式是加 -lm 参数:g++ main.cpp -lm。注意:-lm 必须放在源文件之后;macOS 和 Windows(MSVC)通常自动链接,无需额外操作。
真正容易被忽略的是:当项目用 CMake 时,不能只写 target_include_directories,还得显式链接:target_link_libraries(myapp m)(Linux)或保持空(其他平台)。否则 CI 构建可能在某台机器上突然失败。