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