00001
00002
00003
00004 #ifndef CoinFloatEqual_H
00005 #define CoinFloatEqual_H
00006
00007 #include <algorithm>
00008 #
00009 #include <cmath>
00010
00011 #include "CoinFinite.hpp"
00012
00045 class CoinAbsFltEq
00046 {
00047 public:
00048
00050
00051 inline bool operator() (const double f1, const double f2) const
00052
00053 { if (CoinIsnan(f1) || CoinIsnan(f2)) return false ;
00054 if (f1 == f2) return true ;
00055 return (fabs(f1-f2) < epsilon_) ; }
00056
00059
00065 CoinAbsFltEq () : epsilon_(1.e-10) {}
00066
00068
00069 CoinAbsFltEq (const double epsilon) : epsilon_(epsilon) {}
00070
00072
00073 virtual ~CoinAbsFltEq () {}
00074
00076
00077 CoinAbsFltEq (const CoinAbsFltEq& src) : epsilon_(src.epsilon_) {}
00078
00080
00081 CoinAbsFltEq& operator= (const CoinAbsFltEq& rhs)
00082
00083 { if (this != &rhs) epsilon_ = rhs.epsilon_ ;
00084 return (*this) ; }
00085
00087
00088 private:
00089
00092
00094
00095 double epsilon_ ;
00096
00098
00099 } ;
00100
00101
00102
00109 class CoinRelFltEq
00110 {
00111 public:
00112
00114
00115 inline bool operator() (const double f1, const double f2) const
00116
00117 { if (CoinIsnan(f1) || CoinIsnan(f2)) return false ;
00118 if (f1 == f2) return true ;
00119 if (!CoinFinite(f1) || !CoinFinite(f2)) return false ;
00120
00121 double tol = (fabs(f1)>fabs(f2))?fabs(f1):fabs(f2) ;
00122
00123 return (fabs(f1-f2) <= epsilon_*(1+tol)) ; }
00124
00127
00128 #ifndef COIN_FLOAT
00129
00133 CoinRelFltEq () : epsilon_(1.e-10) {}
00134 #else
00135
00139 CoinRelFltEq () : epsilon_(1.e-6) {} ;
00140 #endif
00141
00143
00144 CoinRelFltEq (const double epsilon) : epsilon_(epsilon) {}
00145
00147
00148 virtual ~CoinRelFltEq () {}
00149
00151
00152 CoinRelFltEq (const CoinRelFltEq & src) : epsilon_(src.epsilon_) {}
00153
00155
00156 CoinRelFltEq& operator= (const CoinRelFltEq& rhs)
00157
00158 { if (this != &rhs) epsilon_ = rhs.epsilon_ ;
00159 return (*this) ; }
00160
00162
00163 private:
00164
00167
00169
00170 double epsilon_ ;
00171
00173
00174 } ;
00175
00176 #endif