update dev300-m58
[ooovba.git] / sal / qa / inc / valueequal.hxx
blob3024c01d012b5c346c7858673fce904690834d5b
1 #include <math.h>
3 #define PREC_float 1
4 #define PREC_double 2
5 #define PREC_long_double 3
7 template<class T>
8 bool is_equal(T x, T y, sal_Int16 _nPrec)
10 // due to the fact that this check looks only if both values are equal
11 // we only need to look on one value
13 // 14 digits will announce the checkPrecisionSize
15 sal_Int32 nPRECISION;
16 switch(_nPrec)
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;
31 if (x < 0)
33 x = -x;
35 if (y < 0)
37 y = -y;
40 // LLA: due to a bug in printf with '%f' and long double within linux environment
41 // we have to use %lf instead.
43 if (_nPrec != PREC_long_double)
45 t_print(T_VERBOSE, "double equal: %.20f\n", x);
46 t_print(T_VERBOSE, " %.20f\n", y);
48 //here nPrecOfN is the number after dot
49 sal_Int32 nBeforeDot = sal_Int32( log10(x) );
50 if ( nBeforeDot < 0)
52 nBeforeDot = 0;
54 //t_print(T_VERBOSE, "nPRECISION is %d\n", nPRECISION);
55 sal_Int32 nPrecOfN = -nPRECISION + nBeforeDot;
57 if (_nPrec != PREC_long_double)
58 t_print(T_VERBOSE, "nPrecOfN is %d\n", nPrecOfN);
60 long double nPrec = pow(0.1, -nPrecOfN);
62 if (_nPrec != PREC_long_double)
63 t_print(T_VERBOSE, " prec: %.20f\n", nPrec);
65 long double nDelta = fabs( x - y ) ;
67 if (_nPrec != PREC_long_double)
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");
74 if (nDelta > nPrec)
76 // t_print(T_VERBOSE, "values are not equal! ndelta:%.20f\n", nDelta);
77 return false;
79 // else
80 // {
81 // t_print(T_VERBOSE, "values are equal. ndelta:%.20f\n", nDelta);
82 return true;
83 // }
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: }
126 bool is_float_equal(float x, float y)
128 return is_equal<float>(x, y, PREC_float);
130 bool is_double_equal(double x, double y)
132 return is_equal<double>(x, y, PREC_double);