电话
400 9058 355
使用 sqrt 前必须包含 ,否则编译报错;它位于 std 命名空间,有多个重载版本;对负数调用行为未定义;整数开方需防精度误差和溢出;性能敏感场景应避免不必要的 sqrt。
sqrt 前必须包含
不加头文件会导致编译失败,错误信息通常是 ‘sqrt’ was not declared in this scope。C++ 标准库中 sqrt 不在 (C 风格头文件)里直接可用,也不在全局命名空间无条件暴露——它定义在 中,且通常位于 std 命名空间下。
正确写法:
#includedouble x = std::sqrt(16.0); // 推荐显式写 std:: // 或 using std::sqrt; 再调用 sqrt(16.0)
sqrt 有多个重载版本:float sqrtf(float)、double sqrt(dou
ble)、long double sqrtl(long double),传入整数(如 int)会隐式转为 double,但可能损失精度或触发警告sqrt 的行为是未定义的(多数平台返回 NaN,且可能触发浮点异常)using namespace std; 来“省事”,尤其在头文件或大型项目中,容易引发命名冲突如果目标是求整数 n 的整数平方根(即最大的整数 k 满足 k*k ≤ n),直接用 static_cast 很危险。
std::sqrt(25) + 1e-15 可能被截断为 5,但 std::sqrt(9999999999999999ULL) 在 double 下可能无法精确表示,导致向下取整错位uint64_t),double 只有 53 位有效精度,无法准确表示所有 64 位整数,sqrt 结果可能偏小或偏大 1sqrt 得到近似值,再用整数上下调整验证,例如 k = static_cast(std::sqrt(n)); 后检查 (k+1)*(k+1) 或 k*k > n 并修正
sqrt,考虑替代方案在高频循环(如图形渲染、物理模拟)中,sqrt 是相对昂贵的操作,尤其当只需要比较大小(如距离判别)时,完全可避免开方。
dx*dx + dy*dy ,而不是 std::sqrt(dx*dx + dy*dy)
len2 = x*x + y*y,若非零再除以 std::sqrt(len2);若只是归一化方向,且后续只参与点积等运算,有时可延后开方甚至用倒数平方根近似(如 _mm_rsqrt_ss 指令)a*a == b*b 优化成 abs(a) == abs(b),但会识别 x*x + y*y 这类模式并保留为整数/浮点运算
sqrt 对 NaN 和无穷大的行为是标准定义的这是容易被忽略但影响鲁棒性的点:C++ 标准(基于 IEEE 754)规定了这些边界输入的输出。
std::sqrt(NAN) 返回 NAN
std::sqrt(+INFINITY) 也返回 +INFINITY
std::sqrt(-INFINITY) 或负有限数 → 返回 NAN,并可能设置 errno = EDOM(取决于实现和编译选项)std::isnan 或 errno(注意多线程下 errno 不安全),但更推荐前置校验输入范围真正麻烦的是那些看起来合法、实则因中间计算溢出变成 INF 或 NaN 的表达式,比如对极大浮点数先平方再开方——这时候 sqrt 已经救不回精度了。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...