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