电话
400 9058 355
std::hypot(x2-x1, y2-y1)是计算二维欧氏距离最安全的标准解法,它通过内部缩放避免平方溢出或下溢,支持C++11以上,三维可用C++17三参数版或嵌套调用。
std::hypot 计算两点欧氏距离最安全直接调用 std::hypot(x2 - x1, y2 - y1) 就是标准解法。它比手写 sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)) 更可靠,尤其当坐标差值极大或极小时——std::hypot 内部做了缩放防溢出,避免中间项平方导致 double 溢出为 inf。
需要包含头文件:#include ,且确保编译器支持 C++11 或更高(所有主流编译器默认满足)。
std::hypot(std::hypot(x2-x1, y2-y1), z2-z1);C++17 起支持三参数重载 std::hypot(x, y, z)
int 再传入——std::hypot 重载依赖浮点类型,传 int 可能触发隐式转换但不报错,结果精度无保障sqrt 版本性能略高,但没必要过早优化std::hypot 和手写 sqrt 的误差与边界差异两者在绝大多数情况下结果一致(误差在 ULP 级别),但关键区别在极端输入:
x 为 1e200、y 为 1e200 时,手写版 (x*x + y*y) 直接溢出为 inf,sqrt(inf) 还是 inf;而 std::hypot(x, y) 返回约 1.414e200
x 为 1e-200、y 同样很小时,手写版可能因下溢得 0.0,std::hypot 仍能保持有效数字NaN 或 inf 时,两者行为一致:返回 NaN 或 inf
hypot,加一层语义直接在业务逻辑里反复写 std::hypot(p1.x - p2.x, p1.y - p2.y) 易错且难读。推荐封装成函数或方法:
struct Point { double x, y; };
double distance(const Point& a, const Point& b) {
return std::hypot(a.x - b.x, a.y - b.y);
}注意点:
const Point& 避免拷贝,尤其结构体变大时double(std::hypot 对 float 输入返回 float,但混合精度易引发隐式转换,统一用 double 更稳妥)float/long double 多精度,否则增加复杂度却极少收益std::hypot 三参数版算三维距离如果项目已启用 C++17(如 g++ -std=c++17),三维点距离可直接写:std::hypot(dx, dy, dz),无需嵌套调用。
但要注意:
std::hypot 支持不完整,建议升级到 VS2019 或更高 中声明存在(可通过 std::hypot(1.0, 2.0, 3.0) 编译测试)实际用的时候,多数人只关心“别算错”,而不是“快一纳秒”。std::hypot 就是那个少操心的默认选择——只要记得它吃的是浮点数,不是整数,也别指望它处理

邮箱: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...