Talk:cpp/types/numeric limits/epsilon
From cppreference.com
< Talk:cpp | types | numeric limits
[edit] Bibliography for the implementation of almost_equal()
Hi,
Is there any bibliographic reference for the implementation of almost_equal(), in the example section? I wonder, in particular, how it compares to:
double divide_saturated(double a, double b){// Check if division would overflow.if(b <1.0&&(a > b *std::numeric_limits<double>::max())){returnstd::numeric_limits<double>::max();} // Check if division would underflow (or is 0.0/something).if(a ==0.0||(b >1.0&&(a < b *std::numeric_limits<double>::min())))return0.0; return a / b;} // This implementation is based on Knuth, The Art of Computer// Programming, vol. 2, 4.2.2, equations (34) and (36).//// The naive implementation would be://// double const d = std::abs( a - b ) ;// return d <= epsilon * std::abs( a ) &&// d <= epsilon * std::abs( b ) ;//// however the multiplications on the right hand side may cause// underflow. So we go for//// d / abs( a ) <= epsilon &&// d / abs( b ) <= epsilon//// except that we check the division on the left hand side.bool are_close_within_tolerance(double a, double b, double epsilon){doubleconst d = std::abs(a - b);return divide_saturated(d, std::abs(a))<= epsilon && divide_saturated(d, std::abs(b))<= epsilon;}
Thanks. --2001:B01:2404:4:0:0:0:56 08:12, 9 November 2018 (PST)
- The example on this page could certainly use a review (since it appears people use it as more than just a demo of numeric_limits<>::epsilon()). As for your example, for one thing, it does not make use of that "epsilon". --Cubbi (talk) 11:32, 9 November 2018 (PST)
- Of course, I didn't mean to provide an example for this page (because I'm not using epsilon()). I'm just after a general almost_equal() function for floating points, and wondered whether the one provided in this page is such a function. The code I provided is, as the comments say, based on Knuth. I wondered on which source or reasoning is almost_equal() based, instead. --2001:B01:2404:4:0:0:0:56 01:00, 12 November 2018 (PST)
- I believe that the original implementation of almost_equal() was based on this answer on StackOverflow. Also check out this question on StackExchange for revelant infomation. --Raniarel (talk) 21:31, 18 October 2023 (PDT)