sqrt是C++中求平方根的唯一标准函数,定义在中,支持浮点类型但不支持整数直接调用,对负数返回NaN而非抛异常,大整数或需精确整数结果时应改用整数算法。

sqrt 是 C++ 中求平方根的唯一标准函数,定义在 头文件中,适用于 double、float、long double 类型。它不支持整数类型直接调用,也不处理负数输入 —— 这是实际使用中最常出错的两个点。
为什么 sqrt(-1) 不报错但结果是 nan
sqrt 对负数输入返回 NaN(Not a Number),而非抛异常或中断程序。这是因为 IEEE 754 浮点标准规定如此,且 C++ 标准库遵循该行为。
- 运行时不会触发
std::domain_error,除非你手动检查std::isnan() - 若传入
int(如sqrt(-4)),会先隐式转为double,再计算 —— 结果仍是nan,但容易被忽略 - 调试时建议加断言:
assert(x >= 0)或用if (x
sqrt 的重载版本和类型匹配规则
sqrt 有三个重载版本,分别对应 double sqrt(double)、float sqrt(float)、long double sqrt(long double)。编译器根据实参类型自动选择,但隐式转换可能带来精度或性能问题。
- 传
int:调用double版本,无精度损失,但多一次类型提升 - 传
float字面量(如4.0f):调用float版本,比double版本略快,但精度较低 - 传
long long:若值超出double精确表示范围(> 2⁵³),sqrt输入已失真,结果不可靠
替代方案:整数开方不依赖浮点,避免精度与符号问题
当输入确定为非负整数,且需要整数结果(如判断是否为完全平方数),应避免 sqrt + round 的组合 —— 浮点舍入误差可能导致误判。
立即学习“C++免费学习笔记(深入)”;
- 推荐用二分查找实现整数平方根:
int isqrt(int n),时间复杂度O(log n),无浮点误差 - C++20 起可使用
std::sqrt配合std::lround,但必须先验证n >= 0且n在double可精确表示范围内 - 对于大整数(如
uint64_t),sqrt的double版本会丢失低比特位,务必改用整数算法
真正要注意的不是“怎么调用 sqrt”,而是“什么时候不该用它”——尤其是输入来源不可控、类型混杂、或结果要参与后续整数运算时。










