0

0

C++ 怎么计算两点距离 C++ hypot函数计算直角三角形斜边【数学】

尼克

尼克

发布时间:2026-02-01 17:01:15

|

845人浏览过

|

来源于php中文网

原创

std::hypot(x2-x1, y2-y1)是计算二维欧氏距离最安全的标准解法,它通过内部缩放避免平方溢出或下溢,支持C++11以上,三维可用C++17三参数版或嵌套调用。

c++ 怎么计算两点距离 c++ hypot函数计算直角三角形斜边【数学】

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 级别),但关键区别在极端输入:

  • x1e200y1e200 时,手写版 (x*x + y*y) 直接溢出为 infsqrt(inf) 还是 inf;而 std::hypot(x, y) 返回约 1.414e200
  • x1e-200y 同样很小时,手写版可能因下溢得 0.0std::hypot 仍能保持有效数字
  • 传入 NaNinf 时,两者行为一致:返回 NaNinf

二维点距离封装建议:别裸写 hypot,加一层语义

直接在业务逻辑里反复写 std::hypot(p1.x - p2.x, p1.y - p2.y) 易错且难读。推荐封装成函数或方法:

立即学习C++免费学习笔记(深入)”;

讯飞星火
讯飞星火

科大讯飞推出的多功能AI智能助手

下载
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& 避免拷贝,尤其结构体变大时
  • 返回类型明确为 doublestd::hypotfloat 输入返回 float,但混合精度易引发隐式转换,统一用 double 更稳妥)
  • 不建议用宏或模板过度泛化——除非真要支持 float/long double 多精度,否则增加复杂度却极少收益

C++17 以上可用 std::hypot 三参数版算三维距离

如果项目已启用 C++17(如 g++ -std=c++17),三维点距离可直接写:std::hypot(dx, dy, dz),无需嵌套调用。

但要注意:

  • MSVC 2017 初期版本对三参数 std::hypot 支持不完整,建议升级到 VS2019 或更高
  • Clang/GCC 主流版本均稳定支持,但需确认 中声明存在(可通过 std::hypot(1.0, 2.0, 3.0) 编译测试)
  • 若需兼容老标准,坚持用双参数嵌套更省心,性能差异可忽略

实际用的时候,多数人只关心“别算错”,而不是“快一纳秒”。std::hypot 就是那个少操心的默认选择——只要记得它吃的是浮点数,不是整数,也别指望它处理非数值类型。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

580

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

103

2025.10.23

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

532

2023.09.20

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

262

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

192

2025.07.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

503

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

545

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

113

2025.08.29

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

30

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 8.2万人学习

C 教程
C 教程

共75课时 | 4.4万人学习

C++教程
C++教程

共115课时 | 15.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号