www.pudn.com > FlashFormat.rar > FFixed.h


#ifndef FIXED_INCLUDED
#define FIXED_INCLUDED

#define	fixed_1 		0x00010000L	

// fixed 2.0
#define	fixed2 		0x00020000L	
// fixed 0.5
#define	fixedHalf 	0x00008000L	
#define	infinity 	0x7FFFFFFFL
#define	negInfinity 0x80000000L
#define	fixedStdErr 0x0000003FL
// fixed sqrt(2)
#define	fixedSqrt2 	0x00016A0AL	

#define FixedRound(a)		((S16)((SFIXED)(a) + 0x8000L >> 16))
#define FixedTrunc(a)		((S16)((SFIXED)(a) >> 16))

#define	FixedCeiling(a)		((S16)(((SFIXED)(a) + 0x8000L) >> 16))
#define	FixedFloor(a)		((S16)((SFIXED)(a) >> 16 ))

#define FixedToInt(a)		((S16)((SFIXED)(a) + 0x8000L >> 16))
#define IntToFixed(a)		((SFIXED)(a) << 16)
// Fixed integer constant
#define FC(a)				IntToFixed(a)		

#define FixedToFloat(a)		((float)(a) / fixed_1)
#define FloatToFixed(a) 	((SFIXED)((float)(a) * fixed_1))

#define FixedToDouble(a)	((double)(a) / fixed_1)
#define DoubleToFixed(a) 	((SFIXED)((double)(a) * fixed_1))

#define FixedAverage(a, b) (((a) + (b)) >> 1)

#define FixedAbs(x) ((x) < 0 ? -(x) : (x))
#define FixedMin(a, b) ((a) < (b) ? (a) : (b))
#define FixedMax(a, b) ((a) > (b) ? (a) : (b))
#define FixedEqual(a, b, err) (FixedAbs((a) - (b)) <= err)

SFIXED FixedNearestMultiple(SFIXED x, SFIXED factor);

// Note that all angles are handled in Fixed point degrees to simplify rounding issues
// they are kept in the range of 0 to 360 degrees

// Generic Floating point routines for quick porting not fast enough for shipping code
SFIXED FixedMul(SFIXED, SFIXED);
SFIXED FixedDiv(SFIXED, SFIXED);
SFIXED FixedSin(SFIXED);
SFIXED FixedCos(SFIXED);
SFIXED FixedTan(SFIXED);
SFIXED FixedAtan2(SFIXED dy, SFIXED dx);

int _FPMul(int a, int b, int shift);
int _FPDiv(int a, int b, int rshift);

#endif