Ежедневный бит(е) C++ #248, Математические константы в C++20 через заголовок «numbers».
До C++20 использование общих математических констант основывалось либо на POSIX, либо на расширении компилятора через заголовок ‹math.h><.
В C++20 появился новый заголовок ‹numbers, который предоставляет общие математические константы в качестве шаблонов, которые можно специализировать для типов пользователей. Стандартная библиотека предоставляет специализации float, double и long double с псевдонимом для варианта double.
#include <numbers> #include <cmath> struct Fraction { int numerator; int denominator; }; namespace std::numbers { template<> inline constexpr Fraction pi_v<Fraction> = {355, 113}; } using namespace std::numbers; auto custom_log2 = std::log(2.4)/ln2; // ln2 == ln2_v<double> auto custom_log10 = std::log(2.4)/ln10; // ln10 == ln10_v<double> auto circle = 2*pi; // pi == pi_v<double> // phi == phi_v<double> auto approx_fibonacci = [](int in) -> int { return phi*in+0.5; }; int fib7 = approx_fibonacci(8); // fib7 == 13 int fib8 = approx_fibonacci(13); // fib8 == 21 // specialized constant for Fraction user-type auto mypi = pi_v<Fraction>; // mypi == {355, 133}
Откройте пример в Compiler Explorer.