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