C++20 STL numbers 数学常量库
- 1. numbers 概述
- 2. 常见分类与常量速览
- 3. C++示例
1. numbers 概述
<numbers>是 C++20 新增的标准头文件,定义了一组常用数学常量。命名空间是std::numbers。在实际工程应用中,应该用标准替代经验,用规范替代习惯。用<numbers>替代手写常量,统一数学表达方式,提升可读性与可靠性。
核心特点:
- constexpr 编译期常量
- 类型安全(支持模板变量)
- 精度由标准库保证
- 无宏污染、无全局符号冲突
为什么 比宏更好?
| 对比项 | 宏定义 | <numbers> |
|---|---|---|
| 类型安全 | ❌ | ✅ |
| 命名空间 | ❌ | ✅ |
| 编译期 | 部分 | ✅ |
| 精度保证 | 人工 | 标准 |
| 工程规范 | 差 | 高 |
❌ 传统写法:
#definePI3.1415926✅ 现代写法:
constexprautopi=std::numbers::pi;<numbers>与<cmath>的关系
<numbers> | <cmath> |
|---|---|
| 常量 | 函数 |
| 编译期 | 运行期 |
| 类型安全 | 普通函数 |
2. 常见分类与常量速览
π 相关
std::numbers::pi// πstd::numbers::inv_pi// 1 / πstd::numbers::inv_sqrtpi// 1 / √π自然常数e 相关
std::numbers::e// estd::numbers::log2e// log2(e)std::numbers::log10e// log10(e)对数 相关
std::numbers::ln2// ln(2)std::numbers::ln10// ln(10)根号 相关
std::numbers::sqrt2// √2std::numbers::sqrt3// √3std::numbers::inv_sqrt2// 1 / √23. C++示例
角度 ↔ 弧度转换
constexprdoubleDeg2Rad(doubledeg){returndeg*std::numbers::pi/180.0;}constexprdoubleRad2Deg(doublerad){returnrad*180.0/std::numbers::pi;}几何 / 位姿 / 旋转计算
doubleyaw=Deg2Rad(90.0);doublec=std::cos(yaw);doubles=std::sin(yaw);中常用常量汇总(20 个)
pi,inv_pi,inv_sqrtpi,e,log2e,log10e,ln2,ln10,sqrt2,sqrt3,inv_sqrt2,pi_v<float>,pi_v<double>,e_v<float>,e_v<double>,ln2_v<float>,ln10_v<double>,sqrt2_v<float>,sqrt3_v<double>