|
13 | 13 | #ifndef LLVM_SUPPORT_MATHEXTRAS_H |
14 | 14 | #define LLVM_SUPPORT_MATHEXTRAS_H |
15 | 15 |
|
| 16 | +#include "llvm/ADT/STLForwardCompat.h" |
16 | 17 | #include "llvm/ADT/bit.h" |
17 | 18 | #include "llvm/Support/Compiler.h" |
18 | 19 | #include <cassert> |
@@ -42,38 +43,28 @@ using common_sint = |
42 | 43 |
|
43 | 44 | /// Mathematical constants. |
44 | 45 | namespace numbers { |
45 | | -// TODO: Track C++20 std::numbers. |
46 | 46 | // clang-format off |
47 | | -constexpr double e = 0x1.5bf0a8b145769P+1, // (2.7182818284590452354) https://oeis.org/A001113 |
48 | | - egamma = 0x1.2788cfc6fb619P-1, // (.57721566490153286061) https://oeis.org/A001620 |
49 | | - ln2 = 0x1.62e42fefa39efP-1, // (.69314718055994530942) https://oeis.org/A002162 |
50 | | - ln10 = 0x1.26bb1bbb55516P+1, // (2.3025850929940456840) https://oeis.org/A002392 |
51 | | - log2e = 0x1.71547652b82feP+0, // (1.4426950408889634074) |
52 | | - log10e = 0x1.bcb7b1526e50eP-2, // (.43429448190325182765) |
53 | | - pi = 0x1.921fb54442d18P+1, // (3.1415926535897932385) https://oeis.org/A000796 |
54 | | - inv_pi = 0x1.45f306dc9c883P-2, // (.31830988618379067154) https://oeis.org/A049541 |
55 | | - sqrtpi = 0x1.c5bf891b4ef6bP+0, // (1.7724538509055160273) https://oeis.org/A002161 |
56 | | - inv_sqrtpi = 0x1.20dd750429b6dP-1, // (.56418958354775628695) https://oeis.org/A087197 |
57 | | - sqrt2 = 0x1.6a09e667f3bcdP+0, // (1.4142135623730950488) https://oeis.org/A00219 |
58 | | - inv_sqrt2 = 0x1.6a09e667f3bcdP-1, // (.70710678118654752440) |
59 | | - sqrt3 = 0x1.bb67ae8584caaP+0, // (1.7320508075688772935) https://oeis.org/A002194 |
60 | | - inv_sqrt3 = 0x1.279a74590331cP-1, // (.57735026918962576451) |
61 | | - phi = 0x1.9e3779b97f4a8P+0; // (1.6180339887498948482) https://oeis.org/A001622 |
62 | | -constexpr float ef = 0x1.5bf0a8P+1F, // (2.71828183) https://oeis.org/A001113 |
63 | | - egammaf = 0x1.2788d0P-1F, // (.577215665) https://oeis.org/A001620 |
64 | | - ln2f = 0x1.62e430P-1F, // (.693147181) https://oeis.org/A002162 |
65 | | - ln10f = 0x1.26bb1cP+1F, // (2.30258509) https://oeis.org/A002392 |
66 | | - log2ef = 0x1.715476P+0F, // (1.44269504) |
67 | | - log10ef = 0x1.bcb7b2P-2F, // (.434294482) |
68 | | - pif = 0x1.921fb6P+1F, // (3.14159265) https://oeis.org/A000796 |
69 | | - inv_pif = 0x1.45f306P-2F, // (.318309886) https://oeis.org/A049541 |
70 | | - sqrtpif = 0x1.c5bf8aP+0F, // (1.77245385) https://oeis.org/A002161 |
71 | | - inv_sqrtpif = 0x1.20dd76P-1F, // (.564189584) https://oeis.org/A087197 |
72 | | - sqrt2f = 0x1.6a09e6P+0F, // (1.41421356) https://oeis.org/A002193 |
73 | | - inv_sqrt2f = 0x1.6a09e6P-1F, // (.707106781) |
74 | | - sqrt3f = 0x1.bb67aeP+0F, // (1.73205081) https://oeis.org/A002194 |
75 | | - inv_sqrt3f = 0x1.279a74P-1F, // (.577350269) |
76 | | - phif = 0x1.9e377aP+0F; // (1.61803399) https://oeis.org/A001622 |
| 47 | +inline constexpr float ef = e_v<float>; |
| 48 | +inline constexpr float egammaf = egamma_v<float>; |
| 49 | +inline constexpr float ln2f = ln2_v<float>; |
| 50 | +inline constexpr float ln10f = ln10_v<float>; |
| 51 | +inline constexpr float log2ef = log2e_v<float>; |
| 52 | +inline constexpr float log10ef = log10e_v<float>; |
| 53 | +inline constexpr float pif = pi_v<float>; |
| 54 | +inline constexpr float inv_pif = inv_pi_v<float>; |
| 55 | +inline constexpr float inv_sqrtpif = inv_sqrtpi_v<float>; |
| 56 | +inline constexpr float sqrt2f = sqrt2_v<float>; |
| 57 | +inline constexpr float inv_sqrt2f = inv_sqrt2_v<float>; |
| 58 | +inline constexpr float sqrt3f = sqrt3_v<float>; |
| 59 | +inline constexpr float inv_sqrt3f = inv_sqrt3_v<float>; |
| 60 | +inline constexpr float phif = phi_v<float>; |
| 61 | + |
| 62 | +// sqrtpi is not in C++20 std::numbers. |
| 63 | +template <typename T, typename = std::enable_if_t<std::is_floating_point_v<T>>> |
| 64 | +inline constexpr T sqrtpi_v = T(0x1.c5bf891b4ef6bP+0); // (1.7724538509055160273) https://oeis.org/A002161 |
| 65 | +inline constexpr double sqrtpi = sqrtpi_v<double>; |
| 66 | +inline constexpr float sqrtpif = sqrtpi_v<float>; |
| 67 | + |
77 | 68 | // These string literals are taken from below: |
78 | 69 | // https://github.com/bminor/glibc/blob/8543577b04ded6d979ffcc5a818930e4d74d0645/math/math.h#L1215-L1229 |
79 | 70 | constexpr const char *pis = "3.141592653589793238462643383279502884", |
|
0 commit comments