SFrame 3.6
plug-ins/include/FPCompare.h
Go to the documentation of this file.
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