sqrt函数需包含头文件,仅支持浮点类型,负数返回NaN,整数开方应避免(int)sqrt(n)而用round后转换,Linux链接需-lm。

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











