1 /* -*- mode: C++; indent-tabs-mode: nil; -*-
 
     3  * This file is a part of LEMON, a generic C++ optimization library.
 
     5  * Copyright (C) 2003-2008
 
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
 
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
 
     9  * Permission to use, modify and distribute this software is granted
 
    10  * provided that this copyright notice appears in all copies. For
 
    11  * precise terms see the accompanying LICENSE file.
 
    13  * This software is provided "AS IS" with no warranty of any kind,
 
    14  * express or implied, and with no claim as to its suitability for any
 
    19 #ifndef LEMON_TOLERANCE_H
 
    20 #define LEMON_TOLERANCE_H
 
    24 ///\brief A basic tool to handle the anomalies of calculation with
 
    25 ///floating point numbers.
 
    33   ///\brief A class to provide a basic way to
 
    34   ///handle the comparison of numbers that are obtained
 
    35   ///as a result of a probably inexact computation.
 
    37   ///\ref Tolerance is a class to provide a basic way to
 
    38   ///handle the comparison of numbers that are obtained
 
    39   ///as a result of a probably inexact computation.
 
    41   ///This is an abstract class, it should be specialized for all
 
    42   ///numerical data types. These specialized classes like
 
    43   ///Tolerance<double> may offer additional tuning parameters.
 
    45   ///\sa Tolerance<float>
 
    46   ///\sa Tolerance<double>
 
    47   ///\sa Tolerance<long double>
 
    49   ///\sa Tolerance<long long int>
 
    50   ///\sa Tolerance<unsigned int>
 
    51   ///\sa Tolerance<unsigned long long int>
 
    60     ///The concept is that these bool functions return \c true only if
 
    61     ///the related comparisons hold even if some numerical error appeared
 
    62     ///during the computations.
 
    66     ///Returns \c true if \c a is \e surely strictly less than \c b
 
    67     static bool less(Value a,Value b) {return false;}
 
    68     ///Returns \c true if \c a is \e surely different from \c b
 
    69     static bool different(Value a,Value b) {return false;}
 
    70     ///Returns \c true if \c a is \e surely positive
 
    71     static bool positive(Value a) {return false;}
 
    72     ///Returns \c true if \c a is \e surely negative
 
    73     static bool negative(Value a) {return false;}
 
    74     ///Returns \c true if \c a is \e surely non-zero
 
    75     static bool nonZero(Value a) {return false;}
 
    79     ///Returns the zero value.
 
    80     static Value zero() {return T();}
 
    82     //   static bool finite(Value a) {}
 
    83     //   static Value big() {}
 
    84     //   static Value negativeBig() {}
 
    88   ///Float specialization of Tolerance.
 
    90   ///Float specialization of Tolerance.
 
    94   class Tolerance<float>
 
    96     static float def_epsilon;
 
   102     ///Constructor setting the epsilon tolerance to the default value.
 
   103     Tolerance() : _epsilon(def_epsilon) {}
 
   104     ///Constructor setting the epsilon tolerance to the given value.
 
   105     Tolerance(float e) : _epsilon(e) {}
 
   107     ///Returns the epsilon value.
 
   108     Value epsilon() const {return _epsilon;}
 
   109     ///Sets the epsilon value.
 
   110     void epsilon(Value e) {_epsilon=e;}
 
   112     ///Returns the default epsilon value.
 
   113     static Value defaultEpsilon() {return def_epsilon;}
 
   114     ///Sets the default epsilon value.
 
   115     static void defaultEpsilon(Value e) {def_epsilon=e;}
 
   118     ///See \ref lemon::Tolerance "Tolerance" for more details.
 
   122     ///Returns \c true if \c a is \e surely strictly less than \c b
 
   123     bool less(Value a,Value b) const {return a+_epsilon<b;}
 
   124     ///Returns \c true if \c a is \e surely different from \c b
 
   125     bool different(Value a,Value b) const { return less(a,b)||less(b,a); }
 
   126     ///Returns \c true if \c a is \e surely positive
 
   127     bool positive(Value a) const { return _epsilon<a; }
 
   128     ///Returns \c true if \c a is \e surely negative
 
   129     bool negative(Value a) const { return -_epsilon>a; }
 
   130     ///Returns \c true if \c a is \e surely non-zero
 
   131     bool nonZero(Value a) const { return positive(a)||negative(a); }
 
   136     static Value zero() {return 0;}
 
   139   ///Double specialization of Tolerance.
 
   141   ///Double specialization of Tolerance.
 
   143   ///\relates Tolerance
 
   145   class Tolerance<double>
 
   147     static double def_epsilon;
 
   151     typedef double Value;
 
   153     ///Constructor setting the epsilon tolerance to the default value.
 
   154     Tolerance() : _epsilon(def_epsilon) {}
 
   155     ///Constructor setting the epsilon tolerance to the given value.
 
   156     Tolerance(double e) : _epsilon(e) {}
 
   158     ///Returns the epsilon value.
 
   159     Value epsilon() const {return _epsilon;}
 
   160     ///Sets the epsilon value.
 
   161     void epsilon(Value e) {_epsilon=e;}
 
   163     ///Returns the default epsilon value.
 
   164     static Value defaultEpsilon() {return def_epsilon;}
 
   165     ///Sets the default epsilon value.
 
   166     static void defaultEpsilon(Value e) {def_epsilon=e;}
 
   169     ///See \ref lemon::Tolerance "Tolerance" for more details.
 
   173     ///Returns \c true if \c a is \e surely strictly less than \c b
 
   174     bool less(Value a,Value b) const {return a+_epsilon<b;}
 
   175     ///Returns \c true if \c a is \e surely different from \c b
 
   176     bool different(Value a,Value b) const { return less(a,b)||less(b,a); }
 
   177     ///Returns \c true if \c a is \e surely positive
 
   178     bool positive(Value a) const { return _epsilon<a; }
 
   179     ///Returns \c true if \c a is \e surely negative
 
   180     bool negative(Value a) const { return -_epsilon>a; }
 
   181     ///Returns \c true if \c a is \e surely non-zero
 
   182     bool nonZero(Value a) const { return positive(a)||negative(a); }
 
   187     static Value zero() {return 0;}
 
   190   ///Long double specialization of Tolerance.
 
   192   ///Long double specialization of Tolerance.
 
   194   ///\relates Tolerance
 
   196   class Tolerance<long double>
 
   198     static long double def_epsilon;
 
   199     long double _epsilon;
 
   202     typedef long double Value;
 
   204     ///Constructor setting the epsilon tolerance to the default value.
 
   205     Tolerance() : _epsilon(def_epsilon) {}
 
   206     ///Constructor setting the epsilon tolerance to the given value.
 
   207     Tolerance(long double e) : _epsilon(e) {}
 
   209     ///Returns the epsilon value.
 
   210     Value epsilon() const {return _epsilon;}
 
   211     ///Sets the epsilon value.
 
   212     void epsilon(Value e) {_epsilon=e;}
 
   214     ///Returns the default epsilon value.
 
   215     static Value defaultEpsilon() {return def_epsilon;}
 
   216     ///Sets the default epsilon value.
 
   217     static void defaultEpsilon(Value e) {def_epsilon=e;}
 
   220     ///See \ref lemon::Tolerance "Tolerance" for more details.
 
   224     ///Returns \c true if \c a is \e surely strictly less than \c b
 
   225     bool less(Value a,Value b) const {return a+_epsilon<b;}
 
   226     ///Returns \c true if \c a is \e surely different from \c b
 
   227     bool different(Value a,Value b) const { return less(a,b)||less(b,a); }
 
   228     ///Returns \c true if \c a is \e surely positive
 
   229     bool positive(Value a) const { return _epsilon<a; }
 
   230     ///Returns \c true if \c a is \e surely negative
 
   231     bool negative(Value a) const { return -_epsilon>a; }
 
   232     ///Returns \c true if \c a is \e surely non-zero
 
   233     bool nonZero(Value a) const { return positive(a)||negative(a); }
 
   238     static Value zero() {return 0;}
 
   241   ///Integer specialization of Tolerance.
 
   243   ///Integer specialization of Tolerance.
 
   253     ///See \ref lemon::Tolerance "Tolerance" for more details.
 
   257     ///Returns \c true if \c a is \e surely strictly less than \c b
 
   258     static bool less(Value a,Value b) { return a<b;}
 
   259     ///Returns \c true if \c a is \e surely different from \c b
 
   260     static bool different(Value a,Value b) { return a!=b; }
 
   261     ///Returns \c true if \c a is \e surely positive
 
   262     static bool positive(Value a) { return 0<a; }
 
   263     ///Returns \c true if \c a is \e surely negative
 
   264     static bool negative(Value a) { return 0>a; }
 
   265     ///Returns \c true if \c a is \e surely non-zero
 
   266     static bool nonZero(Value a) { return a!=0; }
 
   271     static Value zero() {return 0;}
 
   274   ///Unsigned integer specialization of Tolerance.
 
   276   ///Unsigned integer specialization of Tolerance.
 
   279   class Tolerance<unsigned int>
 
   283     typedef unsigned int Value;
 
   286     ///See \ref lemon::Tolerance "Tolerance" for more details.
 
   290     ///Returns \c true if \c a is \e surely strictly less than \c b
 
   291     static bool less(Value a,Value b) { return a<b;}
 
   292     ///Returns \c true if \c a is \e surely different from \c b
 
   293     static bool different(Value a,Value b) { return a!=b; }
 
   294     ///Returns \c true if \c a is \e surely positive
 
   295     static bool positive(Value a) { return 0<a; }
 
   296     ///Returns \c true if \c a is \e surely negative
 
   297     static bool negative(Value) { return false; }
 
   298     ///Returns \c true if \c a is \e surely non-zero
 
   299     static bool nonZero(Value a) { return a!=0; }
 
   304     static Value zero() {return 0;}
 
   308   ///Long integer specialization of Tolerance.
 
   310   ///Long integer specialization of Tolerance.
 
   313   class Tolerance<long int>
 
   317     typedef long int Value;
 
   320     ///See \ref lemon::Tolerance "Tolerance" for more details.
 
   324     ///Returns \c true if \c a is \e surely strictly less than \c b
 
   325     static bool less(Value a,Value b) { return a<b;}
 
   326     ///Returns \c true if \c a is \e surely different from \c b
 
   327     static bool different(Value a,Value b) { return a!=b; }
 
   328     ///Returns \c true if \c a is \e surely positive
 
   329     static bool positive(Value a) { return 0<a; }
 
   330     ///Returns \c true if \c a is \e surely negative
 
   331     static bool negative(Value a) { return 0>a; }
 
   332     ///Returns \c true if \c a is \e surely non-zero
 
   333     static bool nonZero(Value a) { return a!=0;}
 
   338     static Value zero() {return 0;}
 
   341   ///Unsigned long integer specialization of Tolerance.
 
   343   ///Unsigned long integer specialization of Tolerance.
 
   346   class Tolerance<unsigned long int>
 
   350     typedef unsigned long int Value;
 
   353     ///See \ref lemon::Tolerance "Tolerance" for more details.
 
   357     ///Returns \c true if \c a is \e surely strictly less than \c b
 
   358     static bool less(Value a,Value b) { return a<b;}
 
   359     ///Returns \c true if \c a is \e surely different from \c b
 
   360     static bool different(Value a,Value b) { return a!=b; }
 
   361     ///Returns \c true if \c a is \e surely positive
 
   362     static bool positive(Value a) { return 0<a; }
 
   363     ///Returns \c true if \c a is \e surely negative
 
   364     static bool negative(Value) { return false; }
 
   365     ///Returns \c true if \c a is \e surely non-zero
 
   366     static bool nonZero(Value a) { return a!=0;}
 
   371     static Value zero() {return 0;}
 
   374 #if defined __GNUC__ && !defined __STRICT_ANSI__
 
   376   ///Long long integer specialization of Tolerance.
 
   378   ///Long long integer specialization of Tolerance.
 
   379   ///\warning This class (more exactly, type <tt>long long</tt>)
 
   380   ///is not ansi compatible.
 
   383   class Tolerance<long long int>
 
   387     typedef long long int Value;
 
   390     ///See \ref lemon::Tolerance "Tolerance" for more details.
 
   394     ///Returns \c true if \c a is \e surely strictly less than \c b
 
   395     static bool less(Value a,Value b) { return a<b;}
 
   396     ///Returns \c true if \c a is \e surely different from \c b
 
   397     static bool different(Value a,Value b) { return a!=b; }
 
   398     ///Returns \c true if \c a is \e surely positive
 
   399     static bool positive(Value a) { return 0<a; }
 
   400     ///Returns \c true if \c a is \e surely negative
 
   401     static bool negative(Value a) { return 0>a; }
 
   402     ///Returns \c true if \c a is \e surely non-zero
 
   403     static bool nonZero(Value a) { return a!=0;}
 
   408     static Value zero() {return 0;}
 
   411   ///Unsigned long long integer specialization of Tolerance.
 
   413   ///Unsigned long long integer specialization of Tolerance.
 
   414   ///\warning This class (more exactly, type <tt>unsigned long long</tt>)
 
   415   ///is not ansi compatible.
 
   418   class Tolerance<unsigned long long int>
 
   422     typedef unsigned long long int Value;
 
   425     ///See \ref lemon::Tolerance "Tolerance" for more details.
 
   429     ///Returns \c true if \c a is \e surely strictly less than \c b
 
   430     static bool less(Value a,Value b) { return a<b;}
 
   431     ///Returns \c true if \c a is \e surely different from \c b
 
   432     static bool different(Value a,Value b) { return a!=b; }
 
   433     ///Returns \c true if \c a is \e surely positive
 
   434     static bool positive(Value a) { return 0<a; }
 
   435     ///Returns \c true if \c a is \e surely negative
 
   436     static bool negative(Value) { return false; }
 
   437     ///Returns \c true if \c a is \e surely non-zero
 
   438     static bool nonZero(Value a) { return a!=0;}
 
   443     static Value zero() {return 0;}
 
   452 #endif //LEMON_TOLERANCE_H