<numbers> 是 C++20 引入的一个标准库头文件,主要提供了一些常见数学常量的定义。这些常量包括圆周率 (π)、自然对数的底 (e)、黄金比例等,它们在数学、物理学等多个领域的计算中非常常用。


目录

  1. 简介
  2. 主要功能
  3. 使用示例
  4. 常见问题
  5. 结论

1. 简介

<numbers> 头文件提供了一些数学常量的标准化表示,使得在 C++ 编程中,处理这些常量时更加简洁和精确。通过此头文件,程序员可以直接使用一组常量而无需自己去手动定义它们。

包含头文件:

#include <numbers>


2. 主要功能

2.1 常见数学常量

<numbers> 提供了以下常见的数学常量,这些常量广泛应用于各种数学计算:

  • std::numbers::pi:圆周率 π,约等于 3.14159265358979323846
  • std::numbers::e:自然对数的底 e,约等于 2.71828182845904523536
  • std::numbers::sqrt2:平方根 2,约等于 1.41421356237309504880
  • std::numbers::log2e:对数底数为 2 的 e 的对数,约等于 1.44269504088896340736
  • std::numbers::log10e:对数底数为 10 的 e 的对数,约等于 0.43429448190325182765
  • std::numbers::inv_pi:π 的倒数,约等于 0.318309886183591
  • std::numbers::inv_sqrt2:平方根 2 的倒数,约等于 0.70710678118654752440
  • std::numbers::golden:黄金比例 φ,约等于 1.618033988749895.

这些常量都是 constexpr,也就是编译时常量,保证了常量值的高效访问。

2.2 精度设置

这些常量的精度为 20 位有效数字,足以满足大多数科学计算的需求。它们通常以浮动点类型 floatdoublelong double 的形式存在,具体类型取决于编译器和平台。


3. 使用示例

示例 1:使用 π 常量

#include <numbers>
#include <iostream>

int main() {
    // 使用 pi 常量进行圆周长计算
    double radius = 5.0;
    double circumference = 2 * std::numbers::pi * radius;
    
    std::cout << "Circumference of a circle with radius " << radius << " is: " 
              << circumference << std::endl;

    return 0;
}

输出:

Circumference of a circle with radius 5 is: 31.4159265358979

示例 2:使用 e 常量

#include <numbers>
#include <iostream>
#include <cmath>

int main() {
    // 使用 e 常量计算指数
    double exponent = 2.0;
    double result = std::pow(std::numbers::e, exponent);
    
    std::cout << "e raised to the power of " << exponent << " is: " 
              << result << std::endl;

    return 0;
}

输出:

e raised to the power of 2 is: 7.38905609893065

示例 3:使用 黄金比例 常量

#include <numbers>
#include <iostream>

int main() {
    // 使用黄金比例常量计算矩形的长宽比例
    double width = 1.0;
    double height = std::numbers::golden * width;

    std::cout << "A rectangle with width " << width << " has height: " 
              << height << " (Golden ratio)" << std::endl;

    return 0;
}

输出:

A rectangle with width 1 has height: 1.61803398874989 (Golden ratio)


4. 常见问题

4.1 std::numbers::piM_PI 有什么区别?

  • std::numbers::pi 是 C++20 标准引入的数学常量,可以通过 std::numbers 命名空间直接访问。
  • M_PI 是 POSIX 系统下的宏定义,通常存在于 <math.h><cmath> 中,可能不是在所有平台上都可用。

相比之下,std::numbers::pi 更加标准化且跨平台,而 M_PI 主要是为了兼容 C 语言而提供的。

4.2 为什么不需要手动定义这些常量?

<numbers> 提供的常量是标准化的,经过广泛的测试和验证,能够保证精度和正确性。手动定义这些常量容易出错并且效率较低,因此使用标准库中的常量更加可靠。

4.3 std::numbers 中有哪些常量?

std::numbers 中包含了常见的数学常量,如圆周率 (pi)、自然对数的底 (e)、平方根 2 (sqrt2)、黄金比例 (golden) 等。这些常量都是 constexpr,可以在编译时直接使用。


5. 结论

<numbers> 是 C++20 标准库中新引入的一个模块,它提供了一些常见的数学常量。这些常量使得数学计算更加简洁,并且减少了手动定义常量时可能出现的错误。通过使用 <numbers> 提供的常量,程序员可以更加专注于算法实现,而无需关心常量的定义和精度。

推荐阅读: