00001 #ifndef DUNE_COMMON_FLOAT_CMP_HH
00002 #define DUNE_COMMON_FLOAT_CMP_HH
00003
00089
00090 namespace Dune {
00093 namespace FloatCmp {
00094
00097 enum CmpStyle {
00099 relativeWeak,
00101 relativeStrong,
00103 absolute,
00105 defaultCmpStyle = relativeWeak
00106 };
00109 enum RoundingStyle {
00111 towardZero,
00113 towardInf,
00115 downward,
00117 upward,
00119 defaultRoundingStyle = towardZero
00120 };
00121
00122 template<class T> struct EpsilonType;
00123
00125
00130 template<class T, CmpStyle style = defaultCmpStyle>
00131 struct DefaultEpsilon {
00133 static typename EpsilonType<T>::Type value();
00134 };
00135
00136
00137
00140
00142
00149 template <class T, CmpStyle style >
00150 bool eq(const T &first,
00151 const T &second,
00152 typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, style>::value());
00154
00162 template <class T, CmpStyle style >
00163 bool ne(const T &first,
00164 const T &second,
00165 typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, style>::value());
00167
00178 template <class T, CmpStyle style >
00179 bool gt(const T &first,
00180 const T &second,
00181 typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, style>::value());
00183
00194 template <class T, CmpStyle style >
00195 bool lt(const T &first,
00196 const T &second,
00197 typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, style>::value());
00199
00210 template <class T, CmpStyle style >
00211 bool ge(const T &first,
00212 const T &second,
00213 typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, style>::value());
00215
00226 template <class T, CmpStyle style >
00227 bool le(const T &first,
00228 const T &second,
00229 typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, style>::value());
00230
00231
00233
00246 template<class I, class T, CmpStyle cstyle , RoundingStyle rstyle >
00247 I round(const T &val, typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, cstyle>::value());
00248
00250
00263 template<class I, class T, CmpStyle cstyle , RoundingStyle rstyle >
00264 I trunc(const T &val, typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, cstyle>::value());
00265
00267
00268 }
00269
00270
00271
00273
00279 template<class T, FloatCmp::CmpStyle cstyle_ = FloatCmp::defaultCmpStyle,
00280 FloatCmp::RoundingStyle rstyle_ = FloatCmp::defaultRoundingStyle>
00281 class FloatCmpOps {
00282 typedef FloatCmp::CmpStyle CmpStyle;
00283 typedef FloatCmp::RoundingStyle RoundingStyle;
00284
00285 public:
00286
00288 static const CmpStyle cstyle = cstyle_;
00290 static const RoundingStyle rstyle = rstyle_;
00292 typedef T ValueType;
00294
00297 typedef typename FloatCmp::EpsilonType<T>::Type EpsilonType;
00298
00299 private:
00300 EpsilonType epsilon_;
00301
00302 typedef FloatCmp::DefaultEpsilon<EpsilonType, cstyle> DefaultEpsilon;
00303
00304 public:
00306
00309 FloatCmpOps(EpsilonType epsilon = DefaultEpsilon::value());
00310
00312 EpsilonType epsilon() const;
00314 void epsilon(EpsilonType epsilon__);
00315
00317 bool eq(const ValueType &first, const ValueType &second) const;
00319
00322 bool ne(const ValueType &first, const ValueType &second) const;
00324
00328 bool gt(const ValueType &first, const ValueType &second) const;
00330
00334 bool lt(const ValueType &first, const ValueType &second) const;
00336
00340 bool ge(const ValueType &first, const ValueType &second) const;
00342
00346 bool le(const ValueType &first, const ValueType &second) const;
00347
00349
00358 template<class I>
00359 I round(const ValueType &val) const;
00360
00362
00371 template<class I>
00372 I trunc(const ValueType &val) const;
00373
00374 };
00375
00376 }
00377
00378 #include "float_cmp.cc"
00379
00380 #endif //DUNE_COMMON_FLOAT_CMP_HH