xref: /aoo42x/main/sal/qa/inc/valueequal.hxx (revision cdf0e10c)
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