SFrame 3.6
|
00001 // Dear emacs, this is -*- c++ -*- 00002 // $Id: FPCompare.h 316 2012-06-07 10:11:24Z krasznaa $ 00003 /*************************************************************************** 00004 * @Project: SFrame - ROOT-based analysis framework for ATLAS 00005 * @Package: Plug-ins 00006 * 00007 * @author Stefan Ask <Stefan.Ask@cern.ch> - Manchester 00008 * @author David Berge <David.Berge@cern.ch> - CERN 00009 * @author Johannes Haller <Johannes.Haller@cern.ch> - Hamburg 00010 * @author A. Krasznahorkay <Attila.Krasznahorkay@cern.ch> - CERN/Debrecen 00011 * 00012 ***************************************************************************/ 00013 00086 #ifndef SFRAME_PLUGINS_FPCOMPARE_H 00087 #define SFRAME_PLUGINS_FPCOMPARE_H 00088 00089 // STL include(s): 00090 //#include <cmath> 00091 #include <functional> 00092 00093 // Decide whether we need to use volatile or not. 00094 #if defined(__FLT_EVAL_METHOD__) && \ 00095 (__FLT_EVAL_METHOD__ == 2 || __FLT_EVAL_METHOD__ < 0) 00096 // __FLT_EVAL_METHOD__ < 0 means unspecified. 00097 // Be pessimistic in that case. 00098 # define CXXUTILS_FPCOMPARE_VOLATILE volatile 00099 #elif defined(__i386__) && !defined(__SSE2__) 00100 // On x86, gcc -msse -mfpmath=sse is observed to _not_ generate 00101 // sse fp instructions, but does set __FLT_EVAL_METHOD__ to 0. 00102 // -msse2 -mfpmath=sse does seem to work as expected. 00103 // Special-case this for now; should follow up with a gcc bug report 00104 // if this still happens in current releases. 00105 # define CXXUTILS_FPCOMPARE_VOLATILE volatile 00106 #else 00107 # define CXXUTILS_FPCOMPARE_VOLATILE 00108 #endif 00109 00121 namespace CxxUtils { 00122 00134 namespace fpcompare { 00135 00140 inline 00141 bool equal (double a, double b) 00142 { 00143 CXXUTILS_FPCOMPARE_VOLATILE double va = a; 00144 CXXUTILS_FPCOMPARE_VOLATILE double vb = b; 00145 return va == vb; 00146 } 00147 00152 inline 00153 bool equal (float a, float b) 00154 { 00155 CXXUTILS_FPCOMPARE_VOLATILE float va = a; 00156 CXXUTILS_FPCOMPARE_VOLATILE float vb = b; 00157 return va == vb; 00158 } 00159 00164 inline 00165 bool greater (double a, double b) 00166 { 00167 CXXUTILS_FPCOMPARE_VOLATILE double va = a; 00168 CXXUTILS_FPCOMPARE_VOLATILE double vb = b; 00169 return va > vb; 00170 } 00171 00176 inline 00177 bool greater (float a, float b) 00178 { 00179 CXXUTILS_FPCOMPARE_VOLATILE float va = a; 00180 CXXUTILS_FPCOMPARE_VOLATILE float vb = b; 00181 return va > vb; 00182 } 00183 00188 inline 00189 bool less (double a, double b) 00190 { 00191 CXXUTILS_FPCOMPARE_VOLATILE double va = a; 00192 CXXUTILS_FPCOMPARE_VOLATILE double vb = b; 00193 return va < vb; 00194 } 00195 00200 inline 00201 bool less (float a, float b) 00202 { 00203 CXXUTILS_FPCOMPARE_VOLATILE float va = a; 00204 CXXUTILS_FPCOMPARE_VOLATILE float vb = b; 00205 return va < vb; 00206 } 00207 00212 inline 00213 bool greater_equal (double a, double b) 00214 { 00215 CXXUTILS_FPCOMPARE_VOLATILE double va = a; 00216 CXXUTILS_FPCOMPARE_VOLATILE double vb = b; 00217 return va >= vb; 00218 } 00219 00224 inline 00225 bool greater_equal (float a, float b) 00226 { 00227 CXXUTILS_FPCOMPARE_VOLATILE float va = a; 00228 CXXUTILS_FPCOMPARE_VOLATILE float vb = b; 00229 return va >= vb; 00230 } 00231 00236 inline 00237 bool less_equal (double a, double b) 00238 { 00239 CXXUTILS_FPCOMPARE_VOLATILE double va = a; 00240 CXXUTILS_FPCOMPARE_VOLATILE double vb = b; 00241 return va <= vb; 00242 } 00243 00248 inline 00249 bool less_equal (float a, float b) 00250 { 00251 CXXUTILS_FPCOMPARE_VOLATILE float va = a; 00252 CXXUTILS_FPCOMPARE_VOLATILE float vb = b; 00253 return va <= vb; 00254 } 00255 00256 } // namespace fpcompare 00257 00270 namespace fpcompare_fn { 00271 00275 struct equal 00276 : public std::binary_function<double, double, bool> 00277 { 00278 bool 00279 operator()(double a, double b) const 00280 { return fpcompare::equal (a, b); } 00281 }; 00282 00286 struct equalf 00287 : public std::binary_function<float, float, bool> 00288 { 00289 bool 00290 operator()(float a, float b) const 00291 { return fpcompare::equal (a, b); } 00292 }; 00293 00297 struct greater 00298 : public std::binary_function<double, double, bool> 00299 { 00300 bool 00301 operator()(double a, double b) const 00302 { return fpcompare::greater (a, b); } 00303 }; 00304 00308 struct greaterf 00309 : public std::binary_function<float, float, bool> 00310 { 00311 bool 00312 operator()(float a, float b) const 00313 { return fpcompare::greater (a, b); } 00314 }; 00315 00319 struct less 00320 : public std::binary_function<double, double, bool> 00321 { 00322 bool 00323 operator()(double a, double b) const 00324 { return fpcompare::less (a, b); } 00325 }; 00326 00330 struct lessf 00331 : public std::binary_function<float, float, bool> 00332 { 00333 bool 00334 operator()(float a, float b) const 00335 { return fpcompare::less (a, b); } 00336 }; 00337 00341 struct greater_equal 00342 : public std::binary_function<double, double, bool> 00343 { 00344 bool 00345 operator()(double a, double b) const 00346 { return fpcompare::greater_equal (a, b); } 00347 }; 00348 00352 struct greater_equalf 00353 : public std::binary_function<float, float, bool> 00354 { 00355 bool 00356 operator()(float a, float b) const 00357 { return fpcompare::greater_equal (a, b); } 00358 }; 00359 00363 struct less_equal 00364 : public std::binary_function<double, double, bool> 00365 { 00366 bool 00367 operator()(double a, double b) const 00368 { return fpcompare::less_equal (a, b); } 00369 }; 00370 00374 struct less_equalf 00375 : public std::binary_function<float, float, bool> 00376 { 00377 bool 00378 operator()(float a, float b) const 00379 { return fpcompare::less_equal (a, b); } 00380 }; 00381 00382 } // namespace fpcompare_fn 00383 00384 } // namespace CxxUtils 00385 00386 #endif // SFRAME_PLUGINS_FPCOMPARE_H