C++20 STL <numbers> 数学常量库

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++示例

  1. 角度 ↔ 弧度转换

    cpp 复制代码
    constexpr double Deg2Rad(double deg) {
        return deg * std::numbers::pi / 180.0;
    }
    
    constexpr double Rad2Deg(double rad) {
        return rad * 180.0 / std::numbers::pi;
    }
  2. 几何 / 位姿 / 旋转计算

    cpp 复制代码
    double yaw = Deg2Rad(90.0);
    
    double c = std::cos(yaw);
    double s = std::sin(yaw);
  3. 中常用常量汇总(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>
相关推荐
starzy19901 分钟前
Scala循环与判断:一切皆表达式的控制流
开发语言·人工智能·scala
starzy199016 分钟前
Scala类和对象:从构造器到样例类的完整指南
开发语言·后端·scala
niucloud-admin27 分钟前
NIUCLOUD PHP SAAS上门家政使用文档--服务订单:订单列表
开发语言·php
D e re k ZH33 分钟前
P5025 [SNOI2017] 炸弹
c++·算法
怪我冷i1 小时前
Rust 的impl语法详解
开发语言·后端·rust
wuminyu1 小时前
Java字节码学习总结:字节码如何加载、解析和执行
java·linux·c语言·jvm·c++
qq_406981031 小时前
c++的decltype是什么
开发语言·c++
坤坤子吖1 小时前
算法学习——单调队列
开发语言·c++·笔记·学习·算法
我就是全世界2 小时前
OpenCode Go 套餐划算吗:先看你用哪个模型
开发语言·后端·golang
螺丝钉tina2 小时前
[Playwright] [02]常用命令与调试:Debug UI、Mode和 Trace Viewer
开发语言·javascript·测试工具·ui·自动化