|
Boost : |
From: Kevin Atkinson (kevinatk_at_[hidden])
Date: 2000-04-24 22:24:51
One well known problem with floating point numbers is that the normal
comparisons won't work when the equality case is important. Therefore I
propose a special adapter class be create called safe_double which will
act almost exactly like double (which includes implicit conversion both
ways) but will have "safe" comparison that will take into account
rounding error. For example the ==, <, and <= would be defined as
follows
bool operator == (safe_double rhs, safe_double lhs)
return abs(rhs-lhs) < SMALL_VAL
bool operator < (safe_double rhs, safe_double lhs)
return rhs - lhs < -SMALL_VAL
bool operator <= (safe_double rhs, safe_double lhs)
return rhs - lhs < SMALL_VAL
By implicit conversion both ways I mean the following methods will be
defined.
operator double & ()
operator const double & () const
safe_double(double)
This is 100% safe because the safe_double does absolute NOTHING different
from a double unless they are compared with each other or another
double. Anything less will make safe_double too inconvenient to use.
The only real issue, in my view, is what SMALL_VAL should be.
What do you think? Do you think it would be a useful additional to the
boost library. Naturally safe_float should also be created to compliment
safe_double.
-- Kevin Atkinson kevinatk_at_[hidden] http://metalab.unc.edu/kevina/
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk