reman3/Rayman_X/cpa/public/MTH/MTH_dble.h

628 lines
27 KiB
C

/* ##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) ? MTH_C_MinusONE : MTH_C_ZERO) )
/* ##M==================================================================================
NAME : MTH_M_xAbs
DESCRIPTION : Return the absolute value of a real number
INPUT : a : MTH_tdxReal
OUTPUT : |a| : MTH_tdxReal
=======================================================================================*/
#define MTH_M_xAbs( A ) \
( ( ( 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_bEqualWithEpsilon( A, B, EPS) \
(MTH_M_bLess( MTH_M_xAbs((A)-(B)), (EPS) ))
/* ##M==================================================================================
NAME : MTH_M_bDifferentWithEpsilon
DESCRIPTION : Test if a real is near different 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|<eps : Boolean
=======================================================================================*/
#define MTH_M_bIsNullWithEpsilon(A, EPS) \
(MTH_M_bLess( MTH_M_xAbs(A), (EPS) ))
/* ##-###########################
## Polynomial operations
############################## */
/* ##M==================================================================================
NAME : MTH_M_xLinearInterpol
DESCRIPTION : Return linear interpolation
INPUT : a, b, t : MTH_tdxReal
OUTPUT : a + t*(b-a) : MTH_tdxReal
=======================================================================================*/
#define MTH_M_xLinearInterpol(a, b, t) \
MTH_M_xAdd( (a), MTH_M_xMul((t), MTH_M_xSub( (b), (a) ) ) )
/* ##M==================================================================================
NAME : MTH_M_xTrinomeDelta
DESCRIPTION : Return the delta of a trinome
INPUT : a, b, c : MTH_tdxReal
OUTPUT : b*b - 4*a*c : MTH_tdxReal
=======================================================================================*/
#define MTH_M_xTrinomeDelta( a, b, c) \
( MTH_M_xSub ( MTH_M_xSqr ( (b) ), \
MTH_M_xMul ( MTH_C_4, MTH_M_xMul ( (a), (c) ) ) ) \
)
/* ##-################################
## Trigonometric Mathematics MACRO
################################### */
/* ##M==================================================================================
NAME : MTH_M_xSin
DESCRIPTION : Return the sinus of a real number
INPUT : a : MTH_tdxReal
OUTPUT : sin(a) : MTH_tdxReal
=======================================================================================*/
#define MTH_M_xSin( X ) \
sin( X )
/* ##M==================================================================================
NAME : MTH_M_xCos
DESCRIPTION : Return the cosinus of a real number
INPUT : a : MTH_tdxReal
OUTPUT : cos(a) : MTH_tdxReal
=======================================================================================*/
#define MTH_M_xCos( X ) \
cos( X )
/* ##M==================================================================================
NAME : MTH_M_xTan
DESCRIPTION : Return the tangent of a real number
INPUT : a : MTH_tdxReal
OUTPUT : tan(a) : MTH_tdxReal
=======================================================================================*/
#define MTH_M_xTan( X ) \
tan( X )
/* ##M==================================================================================
NAME : MTH_M_xATan
DESCRIPTION : Return the Arc-tangent of a real number
INPUT : a : MTH_tdxReal
OUTPUT : Atan(a) : MTH_tdxReal
=======================================================================================*/
#define MTH_M_xATan( X ) \
atan( X )
/* ##M==================================================================================
NAME : MTH_M_xACos
DESCRIPTION : Return the Arc-cosinus of a real number
INPUT : a : MTH_tdxReal
OUTPUT : Acos(a) : MTH_tdxReal
=======================================================================================*/
#define MTH_M_xACos( X ) \
acos( X )
/* ##M==================================================================================
NAME : MTH_M_xASin
DESCRIPTION : Return the Arc-sinus of a real number
INPUT : a : MTH_tdxReal
OUTPUT : Asin(a) : MTH_tdxReal
=======================================================================================*/
#define MTH_M_xASin( X ) \
asin( X )
/* ##M==================================================================================
NAME : MTH_M_xCoTan
DESCRIPTION : Return the Co-tangent of a real number
INPUT : a : MTH_tdxReal
OUTPUT : CoTan(a) : MTH_tdxReal
=======================================================================================*/
#define MTH_M_xCoTan( X ) \
(MTH_C_ONE / tan( X ))
/* ##M==================================================================================
NAME : MTH_M_xDegToRad
DESCRIPTION : Return the conversion from degree to radian
INPUT : a : MTH_tdxReal
OUTPUT : rad(a) : MTH_tdxReal
=======================================================================================*/
#define MTH_M_xDegToRad( X ) \
( ( X ) *( MTH_C_PiBy180 ) )
/* ##M==================================================================================
NAME : MTH_M_xDegToRad
DESCRIPTION : Return the conversion from radian to degree
INPUT : a : MTH_tdxReal
OUTPUT : deg(a) : MTH_tdxReal
=======================================================================================*/
#define MTH_M_xRadToDeg( X ) \
( ( X ) *( MTH_C_180ByPi ) )
#endif /* MTH_DBLE_H */