1*da0073e9SAndroid Build Coastguard Worker #pragma once 2*da0073e9SAndroid Build Coastguard Worker 3*da0073e9SAndroid Build Coastguard Worker #include <c10/macros/Macros.h> 4*da0073e9SAndroid Build Coastguard Worker #include <c10/util/BFloat16.h> 5*da0073e9SAndroid Build Coastguard Worker #include <c10/util/Half.h> 6*da0073e9SAndroid Build Coastguard Worker 7*da0073e9SAndroid Build Coastguard Worker C10_CLANG_DIAGNOSTIC_PUSH() 8*da0073e9SAndroid Build Coastguard Worker #if C10_CLANG_HAS_WARNING("-Wimplicit-float-conversion") 9*da0073e9SAndroid Build Coastguard Worker C10_CLANG_DIAGNOSTIC_IGNORE("-Wimplicit-float-conversion") 10*da0073e9SAndroid Build Coastguard Worker #endif 11*da0073e9SAndroid Build Coastguard Worker 12*da0073e9SAndroid Build Coastguard Worker namespace c10 { 13*da0073e9SAndroid Build Coastguard Worker // TODO: Replace me with inline constexpr variable when C++17 becomes available 14*da0073e9SAndroid Build Coastguard Worker namespace detail { 15*da0073e9SAndroid Build Coastguard Worker template <typename T> e()16*da0073e9SAndroid Build Coastguard WorkerC10_HOST_DEVICE inline constexpr T e() { 17*da0073e9SAndroid Build Coastguard Worker return static_cast<T>(2.718281828459045235360287471352662); 18*da0073e9SAndroid Build Coastguard Worker } 19*da0073e9SAndroid Build Coastguard Worker 20*da0073e9SAndroid Build Coastguard Worker template <typename T> euler()21*da0073e9SAndroid Build Coastguard WorkerC10_HOST_DEVICE inline constexpr T euler() { 22*da0073e9SAndroid Build Coastguard Worker return static_cast<T>(0.577215664901532860606512090082402); 23*da0073e9SAndroid Build Coastguard Worker } 24*da0073e9SAndroid Build Coastguard Worker 25*da0073e9SAndroid Build Coastguard Worker template <typename T> frac_1_pi()26*da0073e9SAndroid Build Coastguard WorkerC10_HOST_DEVICE inline constexpr T frac_1_pi() { 27*da0073e9SAndroid Build Coastguard Worker return static_cast<T>(0.318309886183790671537767526745028); 28*da0073e9SAndroid Build Coastguard Worker } 29*da0073e9SAndroid Build Coastguard Worker 30*da0073e9SAndroid Build Coastguard Worker template <typename T> frac_1_sqrt_pi()31*da0073e9SAndroid Build Coastguard WorkerC10_HOST_DEVICE inline constexpr T frac_1_sqrt_pi() { 32*da0073e9SAndroid Build Coastguard Worker return static_cast<T>(0.564189583547756286948079451560772); 33*da0073e9SAndroid Build Coastguard Worker } 34*da0073e9SAndroid Build Coastguard Worker 35*da0073e9SAndroid Build Coastguard Worker template <typename T> frac_sqrt_2()36*da0073e9SAndroid Build Coastguard WorkerC10_HOST_DEVICE inline constexpr T frac_sqrt_2() { 37*da0073e9SAndroid Build Coastguard Worker return static_cast<T>(0.707106781186547524400844362104849); 38*da0073e9SAndroid Build Coastguard Worker } 39*da0073e9SAndroid Build Coastguard Worker 40*da0073e9SAndroid Build Coastguard Worker template <typename T> frac_sqrt_3()41*da0073e9SAndroid Build Coastguard WorkerC10_HOST_DEVICE inline constexpr T frac_sqrt_3() { 42*da0073e9SAndroid Build Coastguard Worker return static_cast<T>(0.577350269189625764509148780501957); 43*da0073e9SAndroid Build Coastguard Worker } 44*da0073e9SAndroid Build Coastguard Worker 45*da0073e9SAndroid Build Coastguard Worker template <typename T> golden_ratio()46*da0073e9SAndroid Build Coastguard WorkerC10_HOST_DEVICE inline constexpr T golden_ratio() { 47*da0073e9SAndroid Build Coastguard Worker return static_cast<T>(1.618033988749894848204586834365638); 48*da0073e9SAndroid Build Coastguard Worker } 49*da0073e9SAndroid Build Coastguard Worker 50*da0073e9SAndroid Build Coastguard Worker template <typename T> ln_10()51*da0073e9SAndroid Build Coastguard WorkerC10_HOST_DEVICE inline constexpr T ln_10() { 52*da0073e9SAndroid Build Coastguard Worker return static_cast<T>(2.302585092994045684017991454684364); 53*da0073e9SAndroid Build Coastguard Worker } 54*da0073e9SAndroid Build Coastguard Worker 55*da0073e9SAndroid Build Coastguard Worker template <typename T> ln_2()56*da0073e9SAndroid Build Coastguard WorkerC10_HOST_DEVICE inline constexpr T ln_2() { 57*da0073e9SAndroid Build Coastguard Worker return static_cast<T>(0.693147180559945309417232121458176); 58*da0073e9SAndroid Build Coastguard Worker } 59*da0073e9SAndroid Build Coastguard Worker 60*da0073e9SAndroid Build Coastguard Worker template <typename T> log_10_e()61*da0073e9SAndroid Build Coastguard WorkerC10_HOST_DEVICE inline constexpr T log_10_e() { 62*da0073e9SAndroid Build Coastguard Worker return static_cast<T>(0.434294481903251827651128918916605); 63*da0073e9SAndroid Build Coastguard Worker } 64*da0073e9SAndroid Build Coastguard Worker 65*da0073e9SAndroid Build Coastguard Worker template <typename T> log_2_e()66*da0073e9SAndroid Build Coastguard WorkerC10_HOST_DEVICE inline constexpr T log_2_e() { 67*da0073e9SAndroid Build Coastguard Worker return static_cast<T>(1.442695040888963407359924681001892); 68*da0073e9SAndroid Build Coastguard Worker } 69*da0073e9SAndroid Build Coastguard Worker 70*da0073e9SAndroid Build Coastguard Worker template <typename T> pi()71*da0073e9SAndroid Build Coastguard WorkerC10_HOST_DEVICE inline constexpr T pi() { 72*da0073e9SAndroid Build Coastguard Worker return static_cast<T>(3.141592653589793238462643383279502); 73*da0073e9SAndroid Build Coastguard Worker } 74*da0073e9SAndroid Build Coastguard Worker 75*da0073e9SAndroid Build Coastguard Worker template <typename T> sqrt_2()76*da0073e9SAndroid Build Coastguard WorkerC10_HOST_DEVICE inline constexpr T sqrt_2() { 77*da0073e9SAndroid Build Coastguard Worker return static_cast<T>(1.414213562373095048801688724209698); 78*da0073e9SAndroid Build Coastguard Worker } 79*da0073e9SAndroid Build Coastguard Worker 80*da0073e9SAndroid Build Coastguard Worker template <typename T> sqrt_3()81*da0073e9SAndroid Build Coastguard WorkerC10_HOST_DEVICE inline constexpr T sqrt_3() { 82*da0073e9SAndroid Build Coastguard Worker return static_cast<T>(1.732050807568877293527446341505872); 83*da0073e9SAndroid Build Coastguard Worker } 84*da0073e9SAndroid Build Coastguard Worker 85*da0073e9SAndroid Build Coastguard Worker template <> 86*da0073e9SAndroid Build Coastguard Worker C10_HOST_DEVICE inline constexpr BFloat16 pi<BFloat16>() { 87*da0073e9SAndroid Build Coastguard Worker // According to 88*da0073e9SAndroid Build Coastguard Worker // https://en.wikipedia.org/wiki/Bfloat16_floating-point_format#Special_values 89*da0073e9SAndroid Build Coastguard Worker // pi is encoded as 4049 90*da0073e9SAndroid Build Coastguard Worker return BFloat16(0x4049, BFloat16::from_bits()); 91*da0073e9SAndroid Build Coastguard Worker } 92*da0073e9SAndroid Build Coastguard Worker 93*da0073e9SAndroid Build Coastguard Worker template <> 94*da0073e9SAndroid Build Coastguard Worker C10_HOST_DEVICE inline constexpr Half pi<Half>() { 95*da0073e9SAndroid Build Coastguard Worker return Half(0x4248, Half::from_bits()); 96*da0073e9SAndroid Build Coastguard Worker } 97*da0073e9SAndroid Build Coastguard Worker } // namespace detail 98*da0073e9SAndroid Build Coastguard Worker 99*da0073e9SAndroid Build Coastguard Worker template <typename T> 100*da0073e9SAndroid Build Coastguard Worker constexpr T e = c10::detail::e<T>(); 101*da0073e9SAndroid Build Coastguard Worker 102*da0073e9SAndroid Build Coastguard Worker template <typename T> 103*da0073e9SAndroid Build Coastguard Worker constexpr T euler = c10::detail::euler<T>(); 104*da0073e9SAndroid Build Coastguard Worker 105*da0073e9SAndroid Build Coastguard Worker template <typename T> 106*da0073e9SAndroid Build Coastguard Worker constexpr T frac_1_pi = c10::detail::frac_1_pi<T>(); 107*da0073e9SAndroid Build Coastguard Worker 108*da0073e9SAndroid Build Coastguard Worker template <typename T> 109*da0073e9SAndroid Build Coastguard Worker constexpr T frac_1_sqrt_pi = c10::detail::frac_1_sqrt_pi<T>(); 110*da0073e9SAndroid Build Coastguard Worker 111*da0073e9SAndroid Build Coastguard Worker template <typename T> 112*da0073e9SAndroid Build Coastguard Worker constexpr T frac_sqrt_2 = c10::detail::frac_sqrt_2<T>(); 113*da0073e9SAndroid Build Coastguard Worker 114*da0073e9SAndroid Build Coastguard Worker template <typename T> 115*da0073e9SAndroid Build Coastguard Worker constexpr T frac_sqrt_3 = c10::detail::frac_sqrt_3<T>(); 116*da0073e9SAndroid Build Coastguard Worker 117*da0073e9SAndroid Build Coastguard Worker template <typename T> 118*da0073e9SAndroid Build Coastguard Worker constexpr T golden_ratio = c10::detail::golden_ratio<T>(); 119*da0073e9SAndroid Build Coastguard Worker 120*da0073e9SAndroid Build Coastguard Worker template <typename T> 121*da0073e9SAndroid Build Coastguard Worker constexpr T ln_10 = c10::detail::ln_10<T>(); 122*da0073e9SAndroid Build Coastguard Worker 123*da0073e9SAndroid Build Coastguard Worker template <typename T> 124*da0073e9SAndroid Build Coastguard Worker constexpr T ln_2 = c10::detail::ln_2<T>(); 125*da0073e9SAndroid Build Coastguard Worker 126*da0073e9SAndroid Build Coastguard Worker template <typename T> 127*da0073e9SAndroid Build Coastguard Worker constexpr T log_10_e = c10::detail::log_10_e<T>(); 128*da0073e9SAndroid Build Coastguard Worker 129*da0073e9SAndroid Build Coastguard Worker template <typename T> 130*da0073e9SAndroid Build Coastguard Worker constexpr T log_2_e = c10::detail::log_2_e<T>(); 131*da0073e9SAndroid Build Coastguard Worker 132*da0073e9SAndroid Build Coastguard Worker template <typename T> 133*da0073e9SAndroid Build Coastguard Worker constexpr T pi = c10::detail::pi<T>(); 134*da0073e9SAndroid Build Coastguard Worker 135*da0073e9SAndroid Build Coastguard Worker template <typename T> 136*da0073e9SAndroid Build Coastguard Worker constexpr T sqrt_2 = c10::detail::sqrt_2<T>(); 137*da0073e9SAndroid Build Coastguard Worker 138*da0073e9SAndroid Build Coastguard Worker template <typename T> 139*da0073e9SAndroid Build Coastguard Worker constexpr T sqrt_3 = c10::detail::sqrt_3<T>(); 140*da0073e9SAndroid Build Coastguard Worker } // namespace c10 141*da0073e9SAndroid Build Coastguard Worker 142*da0073e9SAndroid Build Coastguard Worker C10_CLANG_DIAGNOSTIC_POP() 143