0

0

C++根号运算_C++中执行开方运算技巧

煙雲

煙雲

发布时间:2026-02-01 19:13:15

|

970人浏览过

|

来源于php中文网

原创

使用 sqrt 前必须包含 ,否则编译报错;它位于 std 命名空间,有多个重载版本;对负数调用行为未定义;整数开方需防精度误差和溢出;性能敏感场景应避免不必要的 sqrt。

c++根号运算_c++中执行开方运算技巧

sqrt 前必须包含

不加头文件会导致编译失败,错误信息通常是 ‘sqrt’ was not declared in this scope。C++ 标准库sqrt 不在 (C 风格头文件)里直接可用,也不在全局命名空间无条件暴露——它定义在 中,且通常位于 std 命名空间下。

正确写法:

#include 
double x = std::sqrt(16.0);  // 推荐显式写 std::
// 或 using std::sqrt; 再调用 sqrt(16.0)
  • sqrt 有多个重载版本:float sqrtf(float)double sqrt(double)long double sqrtl(long double),传入整数(如 int)会隐式转为 double,但可能损失精度或触发警告
  • 对负数调用 sqrt 的行为是未定义的(多数平台返回 NaN,且可能触发浮点异常)
  • 不要用 using namespace std; 来“省事”,尤其在头文件或大型项目中,容易引发命名冲突

整数开方要防溢出和精度陷阱

如果目标是求整数 n 的整数平方根(即最大的整数 k 满足 k*k ≤ n),直接用 static_cast(std::sqrt(n)) 很危险。

  • 浮点计算存在舍入误差,例如 std::sqrt(25) + 1e-15 可能被截断为 5,但 std::sqrt(9999999999999999ULL)double 下可能无法精确表示,导致向下取整错位
  • 对大整数(如 uint64_t),double 只有 53 位有效精度,无法准确表示所有 64 位整数,sqrt 结果可能偏小或偏大 1
  • 更稳妥的做法是:先用 sqrt 得到近似值,再用整数上下调整验证,例如 k = static_cast(std::sqrt(n)); 后检查 (k+1)*(k+1) 或 k*k > n 并修正

性能敏感场景慎用 sqrt,考虑替代方案

在高频循环(如图形渲染、物理模拟)中,sqrt 是相对昂贵的操作,尤其当只需要比较大小(如距离判别)时,完全可避免开方。

讯飞绘文
讯飞绘文

讯飞绘文:免费AI写作/AI生成文章

下载

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

  • 判断点是否在圆内?用 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 这类模式并保留为整数/浮点运算

sqrtNaN 和无穷大的行为是标准定义的

这是容易被忽略但影响鲁棒性的点:C++ 标准(基于 IEEE 754)规定了这些边界输入的输出。

  • std::sqrt(NAN) 返回 NAN
  • std::sqrt(+INFINITY) 也返回 +INFINITY
  • std::sqrt(-INFINITY) 或负有限数 → 返回 NAN,并可能设置 errno = EDOM(取决于实现和编译选项)
  • 若需检测失败,可配合 std::isnanerrno(注意多线程下 errno 不安全),但更推荐前置校验输入范围

真正麻烦的是那些看起来合法、实则因中间计算溢出变成 INFNaN 的表达式,比如对极大浮点数先平方再开方——这时候 sqrt 已经救不回精度了。

热门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

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

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

200

2025.08.29

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

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

113

2025.08.29

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

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

103

2025.10.23

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号