1 // Copyright 2009-2020 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
3 
4 #pragma once
5 
6 #include <limits>
7 #include "../platform.h"
8 
9 #ifndef _USE_MATH_DEFINES
10 #define _USE_MATH_DEFINES
11 #endif
12 #include <math.h>  // using cmath causes issues under Windows
13 #include <cfloat>
14 
15 namespace rkcommon {
16   namespace math {
17 
18     static const float one_over_255 = 1.0f / 255.0f;
19     // smallest positive normal number 2^-126=0x1p-126 (needs a C++17 compiler)
20     static const float flt_min = 1.17549435e-38;
21 
22     /* we consider floating point numbers in that range as valid input numbers
23      */
24     static float FLT_LARGE = 1.844E18f;
25 
26     static struct ZeroTy
27     {
28       __forceinline operator double() const
29       {
30         return 0;
31       }
32       __forceinline operator float() const
33       {
34         return 0;
35       }
36       __forceinline operator long long() const
37       {
38         return 0;
39       }
40       __forceinline operator unsigned long long() const
41       {
42         return 0;
43       }
44       __forceinline operator long() const
45       {
46         return 0;
47       }
48       __forceinline operator unsigned long() const
49       {
50         return 0;
51       }
52       __forceinline operator int() const
53       {
54         return 0;
55       }
56       __forceinline operator unsigned int() const
57       {
58         return 0;
59       }
60       __forceinline operator short() const
61       {
62         return 0;
63       }
64       __forceinline operator unsigned short() const
65       {
66         return 0;
67       }
68       __forceinline operator char() const
69       {
70         return 0;
71       }
72       __forceinline operator unsigned char() const
73       {
74         return 0;
75       }
76     } zero MAYBE_UNUSED;
77 
78     static struct OneTy
79     {
80       __forceinline operator double() const
81       {
82         return 1;
83       }
84       __forceinline operator float() const
85       {
86         return 1;
87       }
88       __forceinline operator long long() const
89       {
90         return 1;
91       }
92       __forceinline operator unsigned long long() const
93       {
94         return 1;
95       }
96       __forceinline operator long() const
97       {
98         return 1;
99       }
100       __forceinline operator unsigned long() const
101       {
102         return 1;
103       }
104       __forceinline operator int() const
105       {
106         return 1;
107       }
108       __forceinline operator unsigned int() const
109       {
110         return 1;
111       }
112       __forceinline operator short() const
113       {
114         return 1;
115       }
116       __forceinline operator unsigned short() const
117       {
118         return 1;
119       }
120       __forceinline operator char() const
121       {
122         return 1;
123       }
124       __forceinline operator unsigned char() const
125       {
126         return 1;
127       }
128     } one MAYBE_UNUSED;
129 
130     static struct NegInfTy
131     {
132       __forceinline operator double() const
133       {
134         return -std::numeric_limits<double>::infinity();
135       }
136       __forceinline operator float() const
137       {
138         return -std::numeric_limits<float>::infinity();
139       }
140       __forceinline operator long long() const
141       {
142         return std::numeric_limits<long long>::min();
143       }
144       __forceinline operator unsigned long long() const
145       {
146         return std::numeric_limits<unsigned long long>::min();
147       }
148       __forceinline operator long() const
149       {
150         return std::numeric_limits<long>::min();
151       }
152       __forceinline operator unsigned long() const
153       {
154         return std::numeric_limits<unsigned long>::min();
155       }
156       __forceinline operator int() const
157       {
158         return std::numeric_limits<int>::min();
159       }
160       __forceinline operator unsigned int() const
161       {
162         return std::numeric_limits<unsigned int>::min();
163       }
164       __forceinline operator short() const
165       {
166         return std::numeric_limits<short>::min();
167       }
168       __forceinline operator unsigned short() const
169       {
170         return std::numeric_limits<unsigned short>::min();
171       }
172       __forceinline operator char() const
173       {
174         return std::numeric_limits<char>::min();
175       }
176       __forceinline operator unsigned char() const
177       {
178         return std::numeric_limits<unsigned char>::min();
179       }
180 
181     } neg_inf MAYBE_UNUSED;
182 
183     static struct PosInfTy
184     {
185       __forceinline operator double() const
186       {
187         return std::numeric_limits<double>::infinity();
188       }
189       __forceinline operator float() const
190       {
191         return std::numeric_limits<float>::infinity();
192       }
193       __forceinline operator long long() const
194       {
195         return std::numeric_limits<long long>::max();
196       }
197       __forceinline operator unsigned long long() const
198       {
199         return std::numeric_limits<unsigned long long>::max();
200       }
201       __forceinline operator long() const
202       {
203         return std::numeric_limits<long>::max();
204       }
205       __forceinline operator unsigned long() const
206       {
207         return std::numeric_limits<unsigned long>::max();
208       }
209       __forceinline operator int() const
210       {
211         return std::numeric_limits<int>::max();
212       }
213       __forceinline operator unsigned int() const
214       {
215         return std::numeric_limits<unsigned int>::max();
216       }
217       __forceinline operator short() const
218       {
219         return std::numeric_limits<short>::max();
220       }
221       __forceinline operator unsigned short() const
222       {
223         return std::numeric_limits<unsigned short>::max();
224       }
225       __forceinline operator char() const
226       {
227         return std::numeric_limits<char>::max();
228       }
229       __forceinline operator unsigned char() const
230       {
231         return std::numeric_limits<unsigned char>::max();
232       }
233     } inf MAYBE_UNUSED, pos_inf MAYBE_UNUSED;
234 
235     static struct NaNTy
236     {
237       __forceinline operator double() const
238       {
239         return std::numeric_limits<double>::quiet_NaN();
240       }
241       __forceinline operator float() const
242       {
243         return std::numeric_limits<float>::quiet_NaN();
244       }
245     } nan MAYBE_UNUSED;
246 
247     static struct UlpTy
248     {
249       __forceinline operator double() const
250       {
251         return std::numeric_limits<double>::epsilon();
252       }
253       __forceinline operator float() const
254       {
255         return std::numeric_limits<float>::epsilon();
256       }
257     } ulp MAYBE_UNUSED;
258 
259     static struct PiTy
260     {
261       __forceinline operator double() const
262       {
263         return M_PI;
264       }
265       __forceinline operator float() const
266       {
267         return M_PI;
268       }
269     } pi MAYBE_UNUSED;
270 
271     static struct OneOverPiTy
272     {
273       __forceinline operator double() const
274       {
275         return M_1_PI;
276       }
277       __forceinline operator float() const
278       {
279         return M_1_PI;
280       }
281     } one_over_pi MAYBE_UNUSED;
282 
283     static struct TwoPiTy
284     {
285       __forceinline operator double() const
286       {
287         return 2.0 * M_PI;
288       }
289       __forceinline operator float() const
290       {
291         return 2.0 * M_PI;
292       }
293     } two_pi MAYBE_UNUSED;
294 
295     static struct OneOverTwoPiTy
296     {
297       __forceinline operator double() const
298       {
299         return 0.5 * M_1_PI;
300       }
301       __forceinline operator float() const
302       {
303         return 0.5 * M_1_PI;
304       }
305     } one_over_two_pi MAYBE_UNUSED;
306 
307     static struct FourPiTy
308     {
309       __forceinline operator double() const
310       {
311         return 4.0 * M_PI;
312       }
313       __forceinline operator float() const
314       {
315         return 4.0 * M_PI;
316       }
317     } four_pi MAYBE_UNUSED;
318 
319     static struct OneOverFourPiTy
320     {
321       __forceinline operator double() const
322       {
323         return 0.25 * M_1_PI;
324       }
325       __forceinline operator float() const
326       {
327         return 0.25 * M_1_PI;
328       }
329     } one_over_four_pi MAYBE_UNUSED;
330 
331     static struct StepTy
332     {
333     } step MAYBE_UNUSED;
334 
335     static struct ReverseStepTy
336     {
337     } reverse_step MAYBE_UNUSED;
338 
339     static struct EmptyTy
340     {
341     } empty MAYBE_UNUSED;
342 
343     static struct FullTy
344     {
345     } full MAYBE_UNUSED;
346 
347   }  // namespace math
348 }  // namespace rkcommon
349