1 /* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */ 2 3 #ifndef MPT_BASE_NUMBRES_HPP 4 #define MPT_BASE_NUMBRES_HPP 5 6 7 8 #include "mpt/base/detect_compiler.hpp" 9 #include "mpt/base/namespace.hpp" 10 11 #if MPT_CXX_AT_LEAST(20) 12 #include <numbers> 13 #else 14 #include <type_traits> 15 #include <cmath> 16 #include <math.h> 17 #endif 18 19 20 21 namespace mpt { 22 inline namespace MPT_INLINE_NS { 23 24 25 26 namespace numbers { 27 28 #if MPT_CXX_AT_LEAST(20) 29 30 template <typename T> 31 inline constexpr T e_v = std::numbers::e_v<T>; 32 template <typename T> 33 inline constexpr T log2e_v = std::numbers::log2e_v<T>; 34 template <typename T> 35 inline constexpr T log10e_v = std::numbers::log10e_v<T>; 36 template <typename T> 37 inline constexpr T pi_v = std::numbers::pi_v<T>; 38 template <typename T> 39 inline constexpr T inv_pi_v = std::numbers::inv_pi_v<T>; 40 template <typename T> 41 inline constexpr T inv_sqrtpi_v = std::numbers::inv_sqrtpi_v<T>; 42 template <typename T> 43 inline constexpr T ln2_v = std::numbers::ln2_v<T>; 44 template <typename T> 45 inline constexpr T ln10_v = std::numbers::ln10_v<T>; 46 template <typename T> 47 inline constexpr T sqrt2_v = std::numbers::sqrt2_v<T>; 48 template <typename T> 49 inline constexpr T sqrt3_v = std::numbers::sqrt3_v<T>; 50 template <typename T> 51 inline constexpr T inv_sqrt3_v = std::numbers::inv_sqrt3_v<T>; 52 template <typename T> 53 inline constexpr T egamma_v = std::numbers::egamma_v<T>; 54 template <typename T> 55 inline constexpr T phi_v = std::numbers::phi_v<T>; 56 57 inline constexpr double e = e_v<double>; 58 inline constexpr double log2e = log2e_v<double>; 59 inline constexpr double log10e = log10e_v<double>; 60 inline constexpr double pi = pi_v<double>; 61 inline constexpr double inv_pi = inv_pi_v<double>; 62 inline constexpr double inv_sqrtpi = inv_sqrtpi_v<double>; 63 inline constexpr double ln2 = ln2_v<double>; 64 inline constexpr double ln10 = ln10_v<double>; 65 inline constexpr double sqrt2 = sqrt2_v<double>; 66 inline constexpr double sqrt3 = sqrt3_v<double>; 67 inline constexpr double inv_sqrt3 = inv_sqrt3_v<double>; 68 inline constexpr double egamma = egamma_v<double>; 69 inline constexpr double phi = phi_v<double>; 70 71 #else 72 73 #ifdef M_E 74 template <typename T, typename std::enable_if<std::is_floating_point<T>::value, bool>::type = true> 75 inline constexpr T e_v = static_cast<T>(M_E); 76 #else 77 template <typename T, typename std::enable_if<std::is_floating_point<T>::value, bool>::type = true> 78 inline constexpr T e_v = static_cast<T>(2.71828182845904523536); 79 #endif 80 81 #ifdef M_LOG2E 82 template <typename T, typename std::enable_if<std::is_floating_point<T>::value, bool>::type = true> 83 inline constexpr T log2e_v = static_cast<T>(M_LOG2E); 84 #else 85 template <typename T, typename std::enable_if<std::is_floating_point<T>::value, bool>::type = true> 86 inline constexpr T log2e_v = static_cast<T>(1.44269504088896340736); 87 #endif 88 89 #ifdef M_LOG10E 90 template <typename T, typename std::enable_if<std::is_floating_point<T>::value, bool>::type = true> 91 inline constexpr T log10e_v = static_cast<T>(M_LOG10E); 92 #else 93 template <typename T, typename std::enable_if<std::is_floating_point<T>::value, bool>::type = true> 94 inline constexpr T log10e_v = static_cast<T>(0.434294481903251827651); 95 #endif 96 97 #ifdef M_PI 98 template <typename T, typename std::enable_if<std::is_floating_point<T>::value, bool>::type = true> 99 inline constexpr T pi_v = static_cast<T>(M_PI); 100 #else 101 template <typename T, typename std::enable_if<std::is_floating_point<T>::value, bool>::type = true> 102 inline constexpr T pi_v = static_cast<T>(3.14159265358979323846); 103 #endif 104 105 #ifdef M_1_PI 106 template <typename T, typename std::enable_if<std::is_floating_point<T>::value, bool>::type = true> 107 inline constexpr T inv_pi_v = static_cast<T>(M_1_PI); 108 #else 109 template <typename T, typename std::enable_if<std::is_floating_point<T>::value, bool>::type = true> 110 inline constexpr T inv_pi_v = static_cast<T>(0.318309886183790671538); 111 #endif 112 113 template <typename T, typename std::enable_if<std::is_floating_point<T>::value, bool>::type = true> 114 inline constexpr T inv_sqrtpi_v = static_cast<T>(0.564189583547756286948079451560772586); 115 116 #ifdef M_LN2 117 template <typename T, typename std::enable_if<std::is_floating_point<T>::value, bool>::type = true> 118 inline constexpr T ln2_v = static_cast<T>(M_LN2); 119 #else 120 template <typename T, typename std::enable_if<std::is_floating_point<T>::value, bool>::type = true> 121 inline constexpr T ln2_v = static_cast<T>(0.693147180559945309417); 122 #endif 123 124 #ifdef M_LN10 125 template <typename T, typename std::enable_if<std::is_floating_point<T>::value, bool>::type = true> 126 inline constexpr T ln10_v = static_cast<T>(M_LN10); 127 #else 128 template <typename T, typename std::enable_if<std::is_floating_point<T>::value, bool>::type = true> 129 inline constexpr T ln10_v = static_cast<T>(2.30258509299404568402); 130 #endif 131 132 #ifdef M_SQRT2 133 template <typename T, typename std::enable_if<std::is_floating_point<T>::value, bool>::type = true> 134 inline constexpr T sqrt2_v = static_cast<T>(M_SQRT2); 135 #else 136 template <typename T, typename std::enable_if<std::is_floating_point<T>::value, bool>::type = true> 137 inline constexpr T sqrt2_v = static_cast<T>(1.41421356237309504880); 138 #endif 139 140 template <typename T, typename std::enable_if<std::is_floating_point<T>::value, bool>::type = true> 141 inline constexpr T sqrt3_v = static_cast<T>(1.732050807568877293527446341505872367); 142 143 template <typename T, typename std::enable_if<std::is_floating_point<T>::value, bool>::type = true> 144 inline constexpr T inv_sqrt3_v = static_cast<T>(0.577350269189625764509148780501957456); 145 146 template <typename T, typename std::enable_if<std::is_floating_point<T>::value, bool>::type = true> 147 inline constexpr T egamma_v = static_cast<T>(0.577215664901532860606512090082402431); 148 149 template <typename T, typename std::enable_if<std::is_floating_point<T>::value, bool>::type = true> 150 inline constexpr T phi_v = static_cast<T>(1.618033988749894848204586834365638118); 151 152 inline constexpr double e = e_v<double>; 153 inline constexpr double log2e = log2e_v<double>; 154 inline constexpr double log10e = log10e_v<double>; 155 inline constexpr double pi = pi_v<double>; 156 inline constexpr double inv_pi = inv_pi_v<double>; 157 inline constexpr double inv_sqrtpi = inv_sqrtpi_v<double>; 158 inline constexpr double ln2 = ln2_v<double>; 159 inline constexpr double ln10 = ln10_v<double>; 160 inline constexpr double sqrt2 = sqrt2_v<double>; 161 inline constexpr double sqrt3 = sqrt3_v<double>; 162 inline constexpr double inv_sqrt3 = inv_sqrt3_v<double>; 163 inline constexpr double egamma = egamma_v<double>; 164 inline constexpr double phi = phi_v<double>; 165 166 #endif 167 168 } // namespace numbers 169 170 171 172 } // namespace MPT_INLINE_NS 173 } // namespace mpt 174 175 176 177 #endif // MPT_BASE_NUMBRES_HPP 178