/* ##H_FILE# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ FILE : MTH_dble.h MODULE : MTH (Common Mathematic Library) DESCRIPTION : Real implementation for double VERSION : MTH V5.0.13 / Alexandre LANGER [ALX] Ubi R&D / Add Comments MTH V5.0.14 / Alexandre LANGER [ALX] Ubi R&D / Add MTH_C_MAX_UNSIGNED_CHAR ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ #ifndef MTH_DBLE_H #define MTH_DBLE_H /* ##CONSTANTE#-------------------------------------------------------------------------- Real Constantes declaration ---------------------------------------------------------------------------------------*/ #define MTH_C_InfinitPlus (double) 1.79769313486231E308 #define MTH_C_InfinitMinus (double) -1.79769313486231E308 #define MTH_C_EpsilonPlus (double) 2.2250738585073E-308 #define MTH_C_EpsilonMinus (double) -2.2250738585073E-308 #define MTH_C_Pi (double) 3.141592653589793 #define MTH_C_2Pi (double) 6.283185307179586 #define MTH_C_PiBy2 (double) 1.570796326794896 #define MTH_C_PiBy4 (double) 7.853981633974482E-1 #define MTH_C_PiBy8 (double) 3.926990816987241E-1 #define MTH_C_PiBy180 (double) 1.745329251994329E-2 #define MTH_C_180ByPi (double) 5.729577951308233E1 #define MTH_C_e (double) 2.718281828459045 #define MTH_C_ONE (double) 1.0 #define MTH_C_ZERO (double) 0.0 #define MTH_C_MinusONE (double) -1.0 #define MTH_C_2 (double) 2.0 #define MTH_C_3 (double) 3.0 #define MTH_C_4 (double) 4.0 #define MTH_C_5 (double) 5.0 #define MTH_C_Minus2 (double) -2.0 #define MTH_C_Minus3 (double) -3.0 #define MTH_C_Minus4 (double) -4.0 #define MTH_C_Minus5 (double) -5.0 #define MTH_C_Inv2 (double) 0.5 #define MTH_C_Inv3 (double) 3.333333333333333E-1 #define MTH_C_Inv4 (double) 0.25 #define MTH_C_Inv5 (double) 0.2 #define MTH_C_MinusInv2 (double) -0.5 #define MTH_C_MinusInv3 (double) -3.333333333333333E-1 #define MTH_C_MinusInv4 (double) -0.25 #define MTH_C_MinusInv5 (double) -0.2 #define MTH_C_Sqrt2 (double) 1.414213562373095 #define MTH_C_Sqrt3 (double) 1.732050807568877 #define MTH_C_Sqrt4 (double) 2.0 #define MTH_C_Sqrt5 (double) 2.236067977499790 #define MTH_C_MinusSqrt2 (double) -1.414213562373095 #define MTH_C_MinusSqrt3 (double) -1.732050807568877 #define MTH_C_MinusSqrt4 (double) -2.0 #define MTH_C_MinusSqrt5 (double) -2.236067977499790 #define MTH_C_InvSqrt2 (double) 7.071067811865475E-1 #define MTH_C_InvSqrt3 (double) 5.773502691896259E-1 #define MTH_C_InvSqrt4 (double) 0.5 #define MTH_C_InvSqrt5 (double) 4.472135954999579E-1 #define MTH_C_MinusInvSqrt2 (double) -7.071067811865475E-1 #define MTH_C_MinusInvSqrt3 (double) -5.773502691896259E-1 #define MTH_C_MinusInvSqrt4 (double) -0.5 #define MTH_C_MinusInvSqrt5 (double) -4.472135954999579E-1 #define MTH_C_MAX_UNSIGNED_CHAR (double) 256.0 /* ##MACRO#---------------------------------------------------------------------------- MACRO definition ---------------------------------------------------------------------------------------*/ /* ##-################################################ ## MATHEMATICS MACRO AND FUNCTION FOR DOUBLE REAL ################################################### */ /* ##-################################################ ## Basic Mathematics MACRO ################################################### */ /* ##M================================================================================== NAME : MTH_M_xAdd DESCRIPTION : Return the addition of two real numbers INPUT : a, b : 2 MTH_tdxReal OUTPUT : a + b : MTH_tdxReal =======================================================================================*/ #define MTH_M_xAdd( A, B) \ ((A) + (B)) /* ##M================================================================================== NAME : MTH_M_xSub DESCRIPTION : Return the subtraction of two real numbers INPUT : a, b : 2 MTH_tdxReal OUTPUT : a - b : MTH_tdxReal =======================================================================================*/ #define MTH_M_xSub( A, B) \ ((A) - (B)) /* ##M================================================================================== NAME : MTH_M_xMul DESCRIPTION : Return the multiply of two real numbers INPUT : a, b : 2 MTH_tdxReal OUTPUT : a * b : MTH_tdxReal =======================================================================================*/ #define MTH_M_xMul( A, B) \ ((A) * (B)) /* ##M================================================================================== NAME : MTH_M_xDiv DESCRIPTION : Return the division of two real numbers INPUT : a, b : 2 MTH_tdxReal OUTPUT : a / b : MTH_tdxReal =======================================================================================*/ #define MTH_M_xDiv( A, B) \ ((A) / (B)) /* ##M================================================================================== NAME : MTH_M_xNeg DESCRIPTION : Return the negation of a real number INPUT : a : MTH_tdxReal OUTPUT : -a : MTH_tdxReal =======================================================================================*/ #define MTH_M_xNeg( A ) \ (- (A)) /* ##M================================================================================== NAME : MTH_M_xSqr DESCRIPTION : Return the square of a real number INPUT : a : MTH_tdxReal OUTPUT : a*a : MTH_tdxReal =======================================================================================*/ #define MTH_M_xSqr( A ) \ ( (A) * (A) ) /* ##M================================================================================== NAME : MTH_M_xSqrt DESCRIPTION : Return the square root of a real number INPUT : a : MTH_tdxReal OUTPUT : sqrt(a) : MTH_tdxReal =======================================================================================*/ #define MTH_M_xSqrt( A ) \ ( sqrt(A) ) /* ##M================================================================================== NAME : MTH_M_xInvSqrt DESCRIPTION : Return the inverse of the square root of a real number INPUT : a : MTH_tdxReal OUTPUT : 1/sqrt(a) : MTH_tdxReal =======================================================================================*/ #define MTH_M_xInvSqrt( A ) \ ( MTH_M_xInv( sqrt( (A) ) ) ) /* ##M================================================================================== NAME : MTH_M_xInv DESCRIPTION : Return the inverse of a real number INPUT : a : MTH_tdxReal OUTPUT : 1/a : MTH_tdxReal =======================================================================================*/ #define MTH_M_xInv( A ) \ ( MTH_C_ONE / (A) ) /* ##M================================================================================== NAME : MTH_M_xSign DESCRIPTION : Return the sign of a real number INPUT : a : MTH_tdxReal OUTPUT : -1 if(a<0), 1 if(a>0), else 0 : MTH_tdxReal =======================================================================================*/ #define MTH_M_xSign( A ) \ ( ( (A)>MTH_C_ZERO ) ? MTH_C_ONE : ( ((A) MTH_C_ZERO ) ? ( A ) : ( -( A ) ) ) /* ##M================================================================================== NAME : MTH_M_xNegAbs DESCRIPTION : Return the negative absolute value of a real number INPUT : a : MTH_tdxReal OUTPUT : -|a| : MTH_tdxReal =======================================================================================*/ #define MTH_M_xNegAbs( A ) \ ( ( ( A ) < MTH_C_ZERO ) ? ( A ) : ( -( A ) ) ) /* ##M================================================================================== NAME : MTH_M_xMax DESCRIPTION : Return the maximum of two real numbers INPUT : a, b : MTH_tdxReal OUTPUT : max(a, b) : MTH_tdxReal =======================================================================================*/ #define MTH_M_xMax( A, B) \ (( (A)>(B) ) ? (A) : (B)) /* ##M================================================================================== NAME : MTH_M_xMin DESCRIPTION : Return the minimum of two real numbers INPUT : a, b : MTH_tdxReal OUTPUT : min(a, b) : MTH_tdxReal =======================================================================================*/ #define MTH_M_xMin( A, B) \ (( (A)<(B) ) ? (A) : (B)) /* ##-########################### ## Test on real ############################## */ /* ##M================================================================================== NAME : MTH_M_bGreater DESCRIPTION : Test if a real number is greater than a other INPUT : a, b : MTH_tdxReal OUTPUT : a > b : Boolean =======================================================================================*/ #define MTH_M_bGreater( A, B) \ ( (A)>(B) ) /* ##M================================================================================== NAME : MTH_M_bLess DESCRIPTION : Test if a real number is less than a other INPUT : a, b : MTH_tdxReal OUTPUT : a < b : Boolean =======================================================================================*/ #define MTH_M_bLess( A, B) \ ( (A)<(B) ) /* ##M================================================================================== NAME : MTH_M_bGreaterEqual DESCRIPTION : Test if a real number is greater or equal than a other INPUT : a, b : MTH_tdxReal OUTPUT : a >= b : Boolean =======================================================================================*/ #define MTH_M_bGreaterEqual( A, B) \ ( (A)>=(B) ) /* ##M================================================================================== NAME : MTH_M_bLessEqual DESCRIPTION : Test if a real number is less or equal than a other INPUT : a, b : MTH_tdxReal OUTPUT : a <= b : Boolean =======================================================================================*/ #define MTH_M_bLessEqual( A, B) \ ( (A)<=(B) ) /* ##M================================================================================== NAME : MTH_M_bEqual DESCRIPTION : Test if a real number is equal to a other INPUT : a, b : MTH_tdxReal OUTPUT : a == b : Boolean =======================================================================================*/ #define MTH_M_bEqual( A, B) \ ( (A)==(B) ) /* ##M================================================================================== NAME : MTH_M_bDifferent DESCRIPTION : Test if a real number is different to a other INPUT : a, b : MTH_tdxReal OUTPUT : a != b : Boolean =======================================================================================*/ #define MTH_M_bDifferent( A, B ) \ ( (A)!=(B) ) /* ##M================================================================================== NAME : MTH_M_bIsNull DESCRIPTION : Test if a real number is null INPUT : a : MTH_tdxReal OUTPUT : a == 0.0 : Boolean =======================================================================================*/ #define MTH_M_bIsNull(A) \ ( (A) == MTH_C_ZERO ) /* ##-############################## ## Tools for MulMatrixMatrix 2D ################################# */ /* ##M================================================================================== NAME : MTH_M_xMulAddMul DESCRIPTION : Return the addition of two multiplications INPUT : a, b, c, d : MTH_tdxReal OUTPUT : a*b + c*d : MTH_tdxReal =======================================================================================*/ #define MTH_M_xMulAddMul(a, b, c, d) \ ((a)*(b) + (c)*(d)) /* ##M================================================================================== NAME : MTH_M_xSqrAddSqr DESCRIPTION : Return the addition of two squares INPUT : a, b : MTH_tdxReal OUTPUT : a*a + b*b : MTH_tdxReal =======================================================================================*/ #define MTH_M_xSqrAddSqr(a, b) \ ((a)*(a) + (b)*(b)) /* ##-############################## ## Tools for MulMatrixMatrix 3D ################################# */ /* ##M================================================================================== NAME : MTH_M_xMulSubMul DESCRIPTION : Return the subtraction of two multiplications INPUT : a, b, c, d : MTH_tdxReal OUTPUT : a*b - c*d : MTH_tdxReal =======================================================================================*/ #define MTH_M_xMulSubMul(a, b, c, d) \ ((a)*(b) - (c)*(d)) /* ##M================================================================================== NAME : MTH_M_xMulAddMulAddMul DESCRIPTION : Return the adition of three multiplications INPUT : a, b, c, d, e, f : MTH_tdxReal OUTPUT : a*b + c*d + e*f : MTH_tdxReal =======================================================================================*/ #define MTH_M_xMulAddMulAddMul(a, b, c, d, e, f) \ ((a)*(b) + (c)*(d) + (e)*(f)) /* ##M================================================================================== NAME : MTH_M_xSqrAddSqrAddSqr DESCRIPTION : Return the adition of three squares INPUT : a, b, c : MTH_tdxReal OUTPUT : a*a + b*b + c*c : MTH_tdxReal =======================================================================================*/ #define MTH_M_xSqrAddSqrAddSqr(a, b, c) \ ((a)*(a) + (b)*(b) + (c)*(c)) /* ##M================================================================================== NAME : MTH_M_xMul3 DESCRIPTION : Return the multiplication of three real numbers INPUT : a, b, c : MTH_tdxReal OUTPUT : a*b*c : MTH_tdxReal =======================================================================================*/ #define MTH_M_xMul3(a, b, c) \ ((a)*(b)*(c)) /* ##M================================================================================== NAME : MTH_M_xMul4 DESCRIPTION : Return the multiplication of 4 real numbers INPUT : a, b, c, d : MTH_tdxReal OUTPUT : a*b*c*d : MTH_tdxReal =======================================================================================*/ #define MTH_M_xMul4(a, b, c, d) \ ((a)*(b)*(c)*(d)) /* ##M================================================================================== NAME : MTH_M_xAdd3 DESCRIPTION : Return the addition of three real numbers INPUT : a, b, c : MTH_tdxReal OUTPUT : a+b+c : MTH_tdxReal =======================================================================================*/ #define MTH_M_xAdd3(a, b, c) \ ((a)+(b)+(c)) /* ##-########################### ## Test Real near Zero ############################## */ /* ##M================================================================================== NAME : MTH_M_bEqualZero DESCRIPTION : Test if a real is equal to zero INPUT : a : MTH_tdxReal OUTPUT : a == 0.0 : Boolean =======================================================================================*/ #define MTH_M_bEqualZero( x ) \ MTH_M_bEqual((x), MTH_C_ZERO ) /* ##M================================================================================== NAME : MTH_M_bDifferentZero DESCRIPTION : Test if a real is different to zero INPUT : a : MTH_tdxReal OUTPUT : a != 0.0 : Boolean =======================================================================================*/ #define MTH_M_bDifferentZero( x ) \ MTH_M_bDifferent((x), MTH_C_ZERO ) /* ##M================================================================================== NAME : MTH_M_bGreaterZero DESCRIPTION : Test if a real is greater than zero INPUT : a : MTH_tdxReal OUTPUT : a > 0.0 : Boolean =======================================================================================*/ #define MTH_M_bGreaterZero(x) \ MTH_M_bGreater((x), MTH_C_ZERO) /* ##M================================================================================== NAME : MTH_M_bLessZero DESCRIPTION : Test if a real is less than zero INPUT : a : MTH_tdxReal OUTPUT : a < 0.0 : Boolean =======================================================================================*/ #define MTH_M_bLessZero(x) \ MTH_M_bLess((x), MTH_C_ZERO) /* ##M================================================================================== NAME : MTH_M_bGreaterEqualZero DESCRIPTION : Test if a real is greater or equal than zero INPUT : a : MTH_tdxReal OUTPUT : a >= 0.0 : Boolean =======================================================================================*/ #define MTH_M_bGreaterEqualZero( x ) \ MTH_M_bGreaterEqual((x), MTH_C_ZERO) /* ##M================================================================================== NAME : MTH_M_bLessEqualZero DESCRIPTION : Test if a real is less or equal than zero INPUT : a : MTH_tdxReal OUTPUT : a <= 0.0 : Boolean =======================================================================================*/ #define MTH_M_bLessEqualZero(x) \ MTH_M_bLessEqual((x), MTH_C_ZERO) /* ##M================================================================================== NAME : MTH_M_bInRangeEqual DESCRIPTION : Test if a real is in range or equal of two other reals INPUT : x, a, b : MTH_tdxReal OUTPUT : x E [a,b] : Boolean =======================================================================================*/ #define MTH_M_bInRangeEqual( x, a, b) \ ( MTH_M_bGreaterEqual((x),(a)) && MTH_M_bLessEqual((x),(b)) ) /* ##M================================================================================== NAME : MTH_M_bInRange DESCRIPTION : Test if a real is in range of two other reals INPUT : x, a, b : MTH_tdxReal OUTPUT : x E ]a,b[ : Boolean =======================================================================================*/ #define MTH_M_bInRange( x, a, b) \ ( MTH_M_bGreater((x),(a)) && MTH_M_bLess((x),(b)) ) /* ##M================================================================================== NAME : MTH_M_bInUnitEqual DESCRIPTION : Test if a real is in range of [0,1] INPUT : x, : MTH_tdxReal OUTPUT : x E [0,1] : Boolean =======================================================================================*/ #define MTH_M_bInUnitEqual( x ) \ ( MTH_M_bGreaterEqual((x),MTH_C_ZERO) && MTH_M_bLessEqual((x),MTH_C_ONE)) /* ##M================================================================================== NAME : MTH_M_bInUnit DESCRIPTION : Test if a real is in range of ]0,1[ INPUT : x, : MTH_tdxReal OUTPUT : x E ]0,1[ : Boolean =======================================================================================*/ #define MTH_M_bInUnit( x ) \ ( MTH_M_bGreater((x),MTH_C_ZERO) && MTH_M_bLess((x),MTH_C_ONE) ) /* ##M================================================================================== NAME : MTH_M_bEqualWithEpsilon DESCRIPTION : Test if a real is near a other real INPUT : a, b, eps : MTH_tdxReal OUTPUT : |a-b|eps : Boolean =======================================================================================*/ #define MTH_M_bDifferentWithEpsilon( A, B, EPS ) \ (MTH_M_bGreater( MTH_M_xAbs((A)-(B)), (EPS) )) /* ##M================================================================================== NAME : MTH_M_bIsNullWithEpsilon DESCRIPTION : Test if a real is near zero INPUT : a, eps : MTH_tdxReal OUTPUT : |a|