
Each of our back-ends is designed to maintain precision for add, sub, mul,
div, sqrt.
Excellent, that's exactly what I wanted to know. So I would expect the relative error for those operations to be equal to 1 machine epsilon.
From a brief view on your implementation it seems that there is no way to get access to the internal data, exp, neg, fpclass members. Am I right? Could you expose those as readonly through a const accessor methods? I need this functionality to be able to compare two floating point values within specified ulp range (units in the last place).
Thanks, Andrii
Hi Andrii, I believe the relative error in our basic operations is *less than* or equal to one ULP. However, in portable C++, we can not hack the floating-point type---never. One of our back ends has base-10. The other two have an intriguing combinations of base-2. The hacks of the internal details of these representations would not be portable. Consider ldexp() and frexp(). With our strategy, the user is not granted access to the internal details of the floating-point type. The facility std::numeric_limits<T> has a member called epsilon(), which returns the smallest number in a given floating-point system that differs from 1. To test for relative (in)-equality within one ULP, you need to take the ratio of two quantities, subtract this ratio from 1 and subsequently take the absolute value of the result to obtain a basis for comparison with 1 ULP. This is the normal way for any floating-point type. It is a lot to take at first. But no portable code can rely on the internal representation of the floating-point type. You can only use library functions, limits and/or comparison. I hope this helps. Best regards, Chris.