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