最稳妥获取高精度π的方式是std::acos(-1),它在c++11及以上标准中 universally 可用且精度与double一致;需包含,并确保r≥0以避免逻辑错误。

用 std::acos(-1) 获取高精度 π 值
别硬写 3.14159 或用 M_PI——后者不是 C++ 标准,GCC/Clang 可能默认不启用,Windows 的 MSVC 更是直接不定义。最稳妥的方式是用反余弦函数算 π:std::acos(-1),它在所有标准 C++ 编译器(C++11 起)中都可用,且精度与 double 一致。
- 需要包含头文件:
#include <cmath></cmath> - 调用前确保
using std::acos;或写全std::acos(-1) - 如果对性能极度敏感(比如每秒计算百万次),可将 π 提前算好存为常量,避免重复调用
double 足够,但要注意输入合法性
圆面积公式是 π × r²,r 是半径。用 double 类型足够覆盖日常需求(约 15 位有效数字),但必须检查输入是否非负——负半径无几何意义,会得到正数结果却逻辑错误。
- 建议加断言或条件判断:
if (r - 若接收用户输入,记得处理字符串转数值失败的情况(如
std::stod抛异常) - 注意浮点比较:不要写
r == 0判零,用std::abs(r)
封装成内联函数更安全也更易复用
把计算逻辑包进一个 inline 函数,既避免宏的副作用,又让编译器有机会内联优化。别用 #define PI 3.141592653589793 —— 宏不类型安全,也不能参与 constexpr 推导。
inline double circle_area(double r) {
if (r
- 声明为
constexpr需 C++23 才支持std::acos在编译期求值;C++20 及以前只能运行时算 - 若用于模板场景(比如支持
float/long double),可加模板参数,但注意std::acos重载需匹配类型
输出格式影响“看起来对”,但不改变数值精度
计算结果本身是 double,但打印时默认可能只显示 6 位小数,容易让人误以为精度丢失。比如半径为 1 的圆,实际是 3.141592653589793...,但 std::cout 可能只输出 <code>3.14159。
- 用
std::setprecision和std::fixed控制输出:std::cout -
printf更简洁:printf("%.10f", circle_area(1)); - 记住:格式化只影响显示,不影响
double内部存储精度
实操中最容易漏掉的是输入校验和 π 的获取方式——很多人直接写死 3.14,到高精度场景才发现误差累积;也有人忽略负半径,导致静默错误。这两个点比算法本身更值得花时间确认。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











