xref: /aosp_15_r20/external/pytorch/c10/util/MathConstants.h (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
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 Worker C10_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 Worker C10_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 Worker C10_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 Worker C10_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 Worker C10_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 Worker C10_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 Worker C10_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 Worker C10_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 Worker C10_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 Worker C10_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 Worker C10_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 Worker C10_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 Worker C10_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 Worker C10_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