Free Electron
math.h
Go to the documentation of this file.
1 /* Copyright (C) 2003-2021 Free Electron Organization
2  Any use of this software requires a license. If a valid license
3  was not distributed with this file, visit freeelectron.org. */
4 
5 /** @file */
6 
7 #ifndef __math_h__
8 #define __math_h__
9 
10 #include "fe/core.h"
11 #include <limits>
12 
13 #if FE_OS==FE_WIN32 || FE_OS==FE_WIN64
14 #define _USE_MATH_DEFINES
15 #endif
16 
17 #include <math.h> // SUPPRESS_SCAN
18 
19 #ifdef MODULE_math
20 #define FE_MATH_PORT FE_DL_EXPORT
21 #else
22 #define FE_MATH_PORT FE_DL_IMPORT
23 #endif
24 
25 #define FE_EXPLOIT_MEMCPY FALSE
26 #define FE_BOUNDSCHECK (FE_CODEGEN<=FE_DEBUG)
27 #define FE_VEC_CHECK_VALID (FE_CODEGEN<=FE_DEBUG)
28 
29 #define FE_INVALID_SCALAR(scalar) (scalar != scalar)
30 
31 namespace fe
32 {
33 
34 const Real pi=Real(M_PI);
35 const Real degToRad=fe::pi/Real(180);
36 const Real radToDeg=Real(180)/fe::pi;
37 
38 #if FE_DOUBLE_REAL
39 const Real tol=1e-8;
40 #else
41 const Real tol=1e-5f;
42 #endif
43 
44 extern Real epsilon;
45 class EpsilonCalc
46 {
47  public:
48  EpsilonCalc(void)
49  {
50  epsilon = 1.0;
51  do { epsilon /= 2.0f; }
52  while ((Real)(1.0 + (epsilon/2.0)) != 1.0);
53  }
54 };
55 extern const EpsilonCalc epscalc;
56 
57 typedef enum
58 {
59  e_xAxis=0x00,
60  e_yAxis=0x01,
61  e_zAxis=0x02
62 } Axis;
63 
64 template<class T> T minimum(T a,T b) { return a>b? b: a; }
65 template<class T> T maximum(T a,T b) { return a>b? a: b; }
66 template<class T> T clamp(T a, T lo, T hi)
67 {
68  return (a <= lo) ? lo : ((a >= hi) ? hi : a);
69 }
70 
71 template<class T> T clampmax(T a, T hi)
72 {
73  return (a >= hi) ? hi : a;
74 }
75 
76 template<class T> T clampmin(T a, T lo)
77 {
78  return (a <= lo) ? lo : a;
79 }
80 
81 template<class T> T sign(T a)
82 {
83  return (a < 0.0) ? -1.0 : 1.0;
84 }
85 
86 template<class T> class Matrix3x4;
87 }
88 
89 #include "Vector.h"
90 #include "Vector2.h"
91 #include "Vector3.h"
92 //#include "Vector4.h"
93 //#include "Vector_gnu.h"
94 #include "Color.h"
95 #include "Matrix.h"
96 #include "Quaternion.h"
97 #include "Matrix3x4.h"
98 #include "OrthonormalBasis.h"
99 #include "Euler.h"
100 #include "Box.h"
101 #include "DAGNode.h"
102 #include "Barycenter.h"
103 
104 namespace fe
105 {
106 
107 typedef Vector<3,Real> SpatialVector;
108 typedef Matrix<3,3,Real> SpatialMatrix;
109 
110 template<typename T,typename U>
111 inline bool isZero(T a_value,U a_tolerance)
112 {
113  if(fabs(a_value) > a_tolerance)
114  {
115  return false;
116  }
117  return true;
118 }
119 
120 template <typename T>
121 inline bool isZeroV3(const Vector<3,T> &a_vec,T a_tolerance)
122 {
123  if(!isZero(a_vec[0],a_tolerance) || !isZero(a_vec[1],a_tolerance) ||
124  !isZero(a_vec[2],a_tolerance))
125  {
126  return false;
127  }
128  return true;
129 }
130 
131 template<typename T>
132 inline bool isZero(T a_value)
133 {
134  return isZero(a_value,fe::tol);
135 }
136 
137 inline bool isZero(const Vector<3,double> &a_vec)
138 {
139  return isZeroV3<Real>(a_vec,fe::tol);
140 }
141 
142 inline bool isZero(const Vector<3,float> &a_vec)
143 {
144  return isZeroV3<float>(a_vec,fe::tol);
145 }
146 
147 const SpatialVector zeroVector(Real(0),Real(0),Real(0));
148 
149 }
150 
151 #include "math/Mass.h"
152 #include "math/assertMath.h"
153 #include "math/algorithms.h"
154 
155 #endif // __math_h__
156 
kernel
Definition: namespace.dox:3