00001 /*
00002 File: FCompare.h
00003
00004 Function: float comparisons
00005
00006 */
00007
00008 #ifndef __FCompare__
00009 #define __FCompare__
00010
00011 //
00012 // IEEE single float value tolerance equal macro by Toshi Kato ( July/28/93 )
00013 //
00014
00015 #define FLOAT_EQUAL(a,b,m) FLOAT_EQINT0(*(unsigned int *)&a,*(unsigned int *)&b,m)
00016 #define FLOAT_EQINT0(a,b,m) ((a)<(b)?FLOAT_EQINT1(b,a,m):FLOAT_EQINT1(a,b,m))
00017 #define FLOAT_EQINT1(a,b,m) (m>((a)-(b)))
00018
00019 //
00020 // IEEE single float value tolerance equal macro ( Do not use in case of == 0.0 )
00021 //
00022 #define F_EQ6(a,b) FLOAT_EQUAL(a,b,0x3f) // 6bit mask
00023 #define F_EQ7(a,b) FLOAT_EQUAL(a,b,0x7f) // 7bit mask
00024 #define F_EQ8(a,b) FLOAT_EQUAL(a,b,0xff) // 8bit mask
00025 #define F_EQ9(a,b) FLOAT_EQUAL(a,b,0x1ff) // 9bit mask
00026 #define F_EQ10(a,b) FLOAT_EQUAL(a,b,0x3ff) // 10bit mask
00027 #define F_EQ11(a,b) FLOAT_EQUAL(a,b,0x7ff) // 11bit mask
00028 #define F_EQ12(a,b) FLOAT_EQUAL(a,b,0xfff) // 12bit mask
00029 #define F_EQ13(a,b) FLOAT_EQUAL(a,b,0x1fff) // 13bit mask
00030 #define F_EQ14(a,b) FLOAT_EQUAL(a,b,0x3fff) // 14bit mask
00031 #define F_EQ15(a,b) FLOAT_EQUAL(a,b,0x7fff) // 15bit mask
00032 #define F_EQ16(a,b) FLOAT_EQUAL(a,b,0xffff) // 16bit mask
00033 #define F_EQ17(a,b) FLOAT_EQUAL(a,b,0x1ffff) // 17bit mask
00034 #define F_EQ18(a,b) FLOAT_EQUAL(a,b,0x3ffff) // 18bit mask
00035 #define F_EQ19(a,b) FLOAT_EQUAL(a,b,0x7ffff) // 19bit mask
00036 #define F_EQ20(a,b) FLOAT_EQUAL(a,b,0xfffff) // 20bit mask
00037
00038 //
00039 // IEEE single float value tolerance equal 1.0 macro ( i.e. == 1.0 )
00040 //
00041 #define F_EQ1_6(a) FLOAT_EQINT0(*(unsigned int *)&a,0x3f800000,0x3f) // 6bit mask
00042 #define F_EQ1_7(a) FLOAT_EQINT0(*(unsigned int *)&a,0x3f800000,0x7f) // 7bit mask
00043 #define F_EQ1_8(a) FLOAT_EQINT0(*(unsigned int *)&a,0x3f800000,0xff) // 8bit mask
00044 #define F_EQ1_9(a) FLOAT_EQINT0(*(unsigned int *)&a,0x3f800000,0x1ff) // 9bit mask
00045 #define F_EQ1_10(a) FLOAT_EQINT0(*(unsigned int *)&a,0x3f800000,0x3ff) // 10bit mask
00046
00047 //
00048 // IEEE single float value tolerance equal or greater than macro ( i.e. <= )
00049 //
00050 #define FLOAT_EQG(a,b,m) FLOAT_EQGINT(*(unsigned int *)&a,*(unsigned int *)&b,m)
00051 #define FLOAT_EQGINT(a,b,m) ((a)<(b)?1:FLOAT_EQINT1(a,b,m))
00052
00053 #define F_EQG6(a,b) FLOAT_EQG(a,b,0x3f) // 6bit mask
00054 #define F_EQG7(a,b) FLOAT_EQG(a,b,0x7f) // 7bit mask
00055 #define F_EQG8(a,b) FLOAT_EQG(a,b,0xff) // 8bit mask
00056 #define F_EQG9(a,b) FLOAT_EQG(a,b,0x1ff) // 9bit mask
00057 #define F_EQG10(a,b) FLOAT_EQG(a,b,0x3ff) // 10bit mask
00058
00059 //
00060 // IEEE single float value tolerance equal or greater than 1.0 macro ( i.e. 1.0 <= )
00061 //
00062 #define F_EQG1_6(a) FLOAT_EQGINT(0x3f800000,*(unsigned int *)&a,0x3f) // 6bit mask
00063 #define F_EQG1_7(a) FLOAT_EQGINT(0x3f800000,*(unsigned int *)&a,0x7f) // 7bit mask
00064 #define F_EQG1_8(a) FLOAT_EQGINT(0x3f800000,*(unsigned int *)&a,0xff) // 8bit mask
00065 #define F_EQG1_9(a) FLOAT_EQGINT(0x3f800000,*(unsigned int *)&a,0x1ff) // 9bit mask
00066 #define F_EQG1_10(a) FLOAT_EQGINT(0x3f800000,*(unsigned int *)&a,0x3ff) // 10bit mask
00067
00068 #endif