Ежедневный бит(е) 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.