0

0

C++怎么计算圆周率π_C++高精度算法实现方法【解析】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-03-15 19:45:31

|

258人浏览过

|

来源于php中文网

原创

<p>应优先使用 std::acos(-1.0) 或 std::atan(1.0) * 4.0 获取 double 精度 π,二者精度达约 17 位;C++20 起可声明为 constexpr 编译期常量;高精度需求应直接采用 boost::multiprecision 等成熟库而非手写算法。</p>

c++怎么计算圆周率π_c++高精度算法实现方法【解析】

std::atanstd::acos 直接获取 double 精度 π

绝大多数 C++ 场景根本不需要自己算 π —— 标准库已经提供了足够精确的值。直接调用 std::atan(1.0) * 4.0std::acos(-1.0) 就能得到 double 类型下最接近真实 π 的值(约 17 位有效数字)。

常见错误是手写 3.14159265358979323846 字面量,这不仅易错,还可能因编译器截断或浮点字面量解析差异引入微小偏差。

  • std::acos(-1.0) 更简洁,但需确保 <cmath> 已包含,且传入值在 [-1, 1] 范围内(否则返回 NaN
  • std::atan(1.0) * 4.0 数学意义更直观,但多一次乘法,无实质影响
  • 不要用 float 版本(如 std::atanf),精度掉到 7 位,对多数计算已不够用

需要更高精度时,别手写算法——用 boost::multiprecision

如果真要算到几百位、几千位(比如验证算法或教学演示),自己实现 Chudnovsky 或 Machin 公式极易出错:阶乘溢出、中间项精度丢失、收敛判断不稳、除法舍入累积……这些坑比代码本身还耗时间。

直接用 boost::multiprecision::cpp_dec_float_100 这类现成类型,配合已验证的数值库函数,才是合理路径。

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

  • 示例:用 boost::multiprecision::cpp_dec_float_50 算 50 位 π,只需调 boost::math::constants::pi<T>(),一行搞定
  • 手动实现 Leibniz 级数(4*(1 - 1/3 + 1/5 - 1/7 + ...))看似简单,但收敛极慢——算 10⁶ 项才勉强到 6 位准确小数,且 double 累加会因舍入误差反向漂移
  • Chudnovsky 公式虽快,但涉及大整数阶乘和高精度除法,C++ 原生类型完全无法支撑,必须依赖外部大数库

编译期常量 π:用 constexpr + 标准库函数(C++20 起)

C++20 允许 std::acosstd::atan 在 constexpr 上下文中使用,意味着你可以把 π 定义为编译期常量,避免运行时调用开销。

Fotor
Fotor

Fotor 在线照片编辑器

下载

注意:不是所有编译器默认启用此特性,Clang 需 -std=c++20,GCC 10+ 支持,MSVC 2019 v16.10+ 支持;且必须用 constexpr 变量声明,不能只靠宏或字面量模拟。

  • 正确写法:constexpr double pi = std::acos(-1.0);
  • 错误写法:#define PI 3.14159265358979323846 —— 宏不参与类型检查,也无法用于 constexpr 场景(如数组维度)
  • 若需 float 版本,应显式写 constexpr float pi_f = static_cast<float>(std::acos(-1.0));,避免隐式截断不可控

自定义高精度实现前,先确认是否真需要“算”π

很多所谓“高精度 π 计算需求”,实际只是想用高精度 π 值做后续运算。这时候真正该做的,是选对数值类型和常量来源,而不是重写算法。

比如用 long double 时,不同平台精度差异极大(x86 是 80-bit 扩展精度,ARM64 通常是 IEEE-754 binary64),直接用 std::acos(-1.0L) 比自己“算”更可靠。

  • Linux x86_64 下 long double 可能有 19 位有效数字,但 macOS / iOS 已将其降级为普通 double,此时再用 std::acos(-1.0L) 不会提升精度
  • 如果项目已用 boost::multiprecision,就别重复造轮子;如果没引入任何大数库,又确实需要百位以上 π,那优先考虑 Python 或专用工具生成常量表,而非在 C++ 里实时计算
  • 真正需要动态计算 π 的场景极少:比如硬件受限嵌入式系统(无标准库)、特定密码学协议要求、或算法课设——这种情况下,务必用已知收敛性与误差界的公式,并做中间项截断误差估计

最常被忽略的一点:π 的“精度”永远受限于你使用的数值类型和计算路径。从源码里抄一段 Chudnovsky 实现,不解决大整数、高精度除法、舍入控制,结果很可能还不如 std::acos(-1.0) 可靠。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

595

2024.04.28

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

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

108

2025.10.23

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1570

2023.10.24

typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

119

2023.09.26

define的用法
define的用法

define用法:1、定义常量;2、定义函数宏:3、定义条件编译;4、定义多行宏。更多关于define的用法的内容,大家可以阅读本专题下的文章。

391

2023.10.11

python如何计算数的阶乘
python如何计算数的阶乘

方法:1、使用循环;2、使用递归;3、使用math模块;4、使用reduce函数。更多详细python如何计算数的阶乘的内容,可以阅读下面的文章。

177

2023.11.13

python求阶乘教程大全
python求阶乘教程大全

本专题整合了python求阶乘相关教程,阅读专题下面的文章了解更多详细内容。

13

2025.11.08

python语言求阶乘
python语言求阶乘

本专题整合了python中阶乘相关教程,阅读专题下面的文章了解更多详细步骤。

43

2025.12.06

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

69

2026.03.13

热门下载

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

精品课程

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

共94课时 | 11.4万人学习

C 教程
C 教程

共75课时 | 5.5万人学习

C++教程
C++教程

共115课时 | 22.1万人学习

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

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