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>
相关推荐
名字还没想好☜8 分钟前
Go 的 sync.Cond 实战:用条件变量做等待/通知,比忙轮询省 CPU
开发语言·数据库·后端·golang·go
10岁的博客12 分钟前
【C++题解】最多共线点问题:小飞拿蛋糕游戏的最优策略
c++
東隅已逝,桑榆非晚34 分钟前
类和对象(中)
c++·笔记
运维行者_1 小时前
企业带宽监控工具实战:网络流量分析与异常排查的5个关键能力
运维·服务器·开发语言·网络·分布式·后端·php
Patrick在香港1 小时前
Python爬虫框架实战:优雅抓取香港政府公开API数据的通用方案
java·开发语言·爬虫·python·ai编程·数据可视化·可用性测试
hey_sml1 小时前
MySQL常用操作速记:从字符集到游标全解析
java·开发语言·mysql
广东程序猿小展1 小时前
《007初露锋芒》风灵月影13项修改器下载 007初露锋芒修改器使用方法
开发语言·javascript·ecmascript
wuminyu1 小时前
JDK21解决虚拟线程IO阻塞原理剖析
java·linux·c语言·jvm·c++
MC皮蛋侠客1 小时前
TDengine C++ 系列(4):时序查询——窗口聚合、插值、连接与时序函数
大数据·c++·tdengine
junuo1 小时前
10_C++内存分区与动态内存管理
c++·编程语言