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