1 #include <math.h> 2 3 #define PREC_float 1 4 #define PREC_double 2 5 #define PREC_long_double 3 6 7 template<class T> 8 bool is_equal(T x, T y, sal_Int16 _nPrec) 9 { 10 // due to the fact that this check looks only if both values are equal 11 // we only need to look on one value 12 13 // 14 digits will announce the checkPrecisionSize 14 15 sal_Int32 nPRECISION; 16 switch(_nPrec) 17 { 18 case PREC_float: 19 nPRECISION = 6; 20 break; 21 case PREC_double: 22 nPRECISION = 14; 23 break; 24 case PREC_long_double: 25 nPRECISION = 20; 26 break; 27 default: 28 nPRECISION = 2; 29 } 30 31 if (x < 0) 32 { 33 x = -x; 34 } 35 if (y < 0) 36 { 37 y = -y; 38 } 39 40 // LLA: due to a bug in printf with '%f' and long double within linux environment 41 // we have to use %lf instead. 42 43 if (_nPrec != PREC_long_double) 44 { 45 t_print(T_VERBOSE, "double equal: %.20f\n", x); 46 t_print(T_VERBOSE, " %.20f\n", y); 47 } 48 //here nPrecOfN is the number after dot 49 sal_Int32 nBeforeDot = sal_Int32( log10(x) ); 50 if ( nBeforeDot < 0) 51 { 52 nBeforeDot = 0; 53 } 54 //t_print(T_VERBOSE, "nPRECISION is %d\n", nPRECISION); 55 sal_Int32 nPrecOfN = -nPRECISION + nBeforeDot; 56 57 if (_nPrec != PREC_long_double) 58 t_print(T_VERBOSE, "nPrecOfN is %d\n", nPrecOfN); 59 60 long double nPrec = pow(0.1, -nPrecOfN); 61 62 if (_nPrec != PREC_long_double) 63 t_print(T_VERBOSE, " prec: %.20f\n", nPrec); 64 65 long double nDelta = fabs( x - y ) ; 66 67 if (_nPrec != PREC_long_double) 68 { 69 t_print(T_VERBOSE, " delta: %.20f\n", nDelta); 70 t_print(T_VERBOSE, " nPrec: %.20f\n", nPrec); 71 t_print(T_VERBOSE, "delta must be less or equal to prec!\n\n"); 72 } 73 74 if (nDelta > nPrec) 75 { 76 // t_print(T_VERBOSE, "values are not equal! ndelta:%.20f\n", nDelta); 77 return false; 78 } 79 // else 80 // { 81 // t_print(T_VERBOSE, "values are equal. ndelta:%.20f\n", nDelta); 82 return true; 83 // } 84 } 85 86 // LLA: bool is_float_equal(float x, float y) 87 // LLA: { 88 // LLA: // due to the fact that this check looks only if both values are equal 89 // LLA: // we only need to look on one value 90 // LLA: 91 // LLA: // 6 digits will announce the checkPrecisionSize 92 // LLA: 93 // LLA: const sal_Int32 nPRECISION = 6; 94 // LLA: if (x < 0) 95 // LLA: { 96 // LLA: x = -x; 97 // LLA: } 98 // LLA: if (y < 0) 99 // LLA: { 100 // LLA: y = -y; 101 // LLA: } 102 // LLA: 103 // LLA: t_print(T_VERBOSE, "double equal: %.20f\n# %.20f\n", x, y); 104 // LLA: sal_Int32 nPrecOfN = -nPRECISION + sal_Int32( log10(x) ); 105 // LLA: 106 // LLA: t_print(T_VERBOSE, "prec: %d\n", nPrecOfN); 107 // LLA: double nPrec = pow(10, nPrecOfN) * 1; 108 // LLA: 109 // LLA: t_print(T_VERBOSE, " prec: %.20f\n", nPrec); 110 // LLA: 111 // LLA: double nDelta = fabs( x - y ); 112 // LLA: t_print(T_VERBOSE, " delta: %.20f\n\n", nDelta); 113 // LLA: 114 // LLA: if (nDelta > nPrec) 115 // LLA: { 116 // LLA: // t_print(T_VERBOSE, "values are not equal! ndelta:%.20f\n", nDelta); 117 // LLA: return false; 118 // LLA: } 119 // LLA: // else 120 // LLA: // { 121 // LLA: // t_print(T_VERBOSE, "values are equal. ndelta:%.20f\n", nDelta); 122 // LLA: return true; 123 // LLA: // } 124 // LLA: } 125 126 bool is_float_equal(float x, float y) 127 { 128 return is_equal<float>(x, y, PREC_float); 129 } 130 bool is_double_equal(double x, double y) 131 { 132 return is_equal<double>(x, y, PREC_double); 133 } 134