
template <typename T> struct compare_absolute_error : std::binary_function<T, T, bool> { T eps; compare_absolute_error(T eps_) : eps(eps_) {} bool operator()(T x, T y) const { return abs(x - y) < eps; } };
This kind of operators occurs frequently in algorithms and are sometimes error-prone to write, so having a ready-made and well tested component can certainly be an advantage.
Of course, we could (and should) provide a bunch of different comparison algorithms: absolute and relative in the first place, but there may be others. I believe it might be a little but useful addition to the math library.
Main questions are:
1) Is there interest for this?
Yes, please.
2) What are the comparison algorithms to include?
I've already made a start, well not really a start, just a "I needed this functionality to move on" throw it together sort of start here: http://freespace.virgin.net/boost.regex/toolkit/libs/math/doc/html/math_tool... Relative error in particular is a tricky one, you have to deal with: One or both values may be zero. One or both values may be denorms. One or both values may be infinities. So I guess if you wanted a really super-duper handle it all version you would make it policy based: * Values below a certain threshold are regarded as zero (so all denorms are equivalent for example). * Values above a threshold are regarded as effectively infinity. * Absolute errors are used if the values are small enough. Which of these you actually want to use in your application depend on the QOI of the component you're testing I guess. Personally I treat all denorms as zeros because if the result is a denorm there probably isn't enough information content throughout the calculation that led to the denorm to get an accurate value (if you see what I mean). Anyway, just my 2c worth, please do feel free to jump in with something better if you want! John.