numeric_constants
numeric_constants (수학 상수)
C++20부터 <numbers> 헤더의 std::numbers 네임스페이스에 수학 상수 변수 템플릿과 상수가 정의돼요. e, π, ln2, √2 같은 흔한 수학 상수들을 쓸 수 있어요.
출처: cppreference
본문
상수 (Constants) (since C++20)
<numbers> 헤더에 정의되어 있고, std::numbers 네임스페이스에 정의돼요.
| 이름 | 값 |
|---|---|
| e_v | 수학 상수 e |
| log2e_v | log₂e |
| log10e_v | log₁₀e |
| pi_v | 수학 상수 π |
| inv_pi_v | 1/π |
| inv_sqrtpi_v | 1/√π |
| ln2_v | ln 2 |
| ln10_v | ln 10 |
| sqrt2_v | √2 |
| sqrt3_v | √3 |
| inv_sqrt3_v | 1/√3 |
| egamma_v | 오일러-마스케로니 상수 γ |
| phi_v | 황금비 Φ ((1+√5)/2) |
<numbers> 헤더에 정의되어 있고, std::numbers 네임스페이스에 정의돼요.
| 이름 | 값 |
|---|---|
| inline constexpr double e | e_v<double> (상수) |
| inline constexpr double log2e | log2e_v<double> (상수) |
| inline constexpr double log10e | log10e_v<double> (상수) |
| inline constexpr double pi | pi_v<double> (상수) |
| inline constexpr double inv_pi | inv_pi_v<double> (상수) |
| inline constexpr double inv_sqrtpi | inv_sqrtpi_v<double> (상수) |
| inline constexpr double ln2 | ln2_v<double> (상수) |
| inline constexpr double ln10 | ln10_v<double> (상수) |
| inline constexpr double sqrt2 | sqrt2_v<double> (상수) |
| inline constexpr double sqrt3 | sqrt3_v<double> (상수) |
| inline constexpr double inv_sqrt3 | inv_sqrt3_v<double> (상수) |
| inline constexpr double egamma | egamma_v<double> (상수) |
| inline constexpr double phi | phi_v<double> (상수) |
참고 (Notes)
수학 상수 변수 템플릿의 기본 템플릿을 인스턴스화하는 프로그램은 ill-formed예요.
표준 라이브러리는 모든 부동소수점 타입(즉 float, double, long double, 그리고 C++23부터 고정폭 부동소수점 타입)에 수학 상수 변수 템플릿을 특수화해요.
프로그램은 특수화가 프로그램 정의 타입에 의존한다면 수학 상수 변수 템플릿을 부분 또는 명시적으로 특수화할 수 있어요.
| 피처 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_lib_math_constants |
201907L | (C++20) | 수학 상수 |
예제 (Example)
이 코드를 실행해 봐요.
#include <cmath>
#include <iomanip>
#include <iostream>
#include <limits>
#include <numbers>
#include <string_view>
auto egamma_aprox(const unsigned iterations)
{
long double s{};
for (unsigned m{2}; m != iterations; ++m)
if (const long double t{std::riemann_zetal(m) / m}; m % 2)
s -= t;
else
s += t;
return s;
};
int main()
{
using namespace std::numbers;
constexpr double γ{0.5772156649015328606065120900824024};
std::cout << "γ = " << γ << '\n';
constexpr double pi_4{pi / 4};
constexpr double e_ln2{e * ln2};
std::cout << "π/4 = " << pi_4 << "\ne·ln2 = " << e_ln2 << '\n';
// e, π, √2, √3, Φ 정수 표현값과의 비교 확인 등
}