I am using GCC 3.4 on Linux (AS 3) and trying to figure out to get DBL_EPSILON, or at least a decent approximation. How can I get it programmatically?
I am using GCC 3.4 on Linux (AS 3) and trying to figure out
Share
Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.
Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.
Lost your password? Please enter your email address. You will receive a link and will create a new password via email.
Please briefly explain why you feel this question should be reported.
Please briefly explain why you feel this answer should be reported.
Please briefly explain why you feel this user should be reported.
It should be in “float.h”. That is portable, it’s part of the C and C++ standards (albeit deprecated in C++ – use
<cfloat>or sbi’s answer for “guaranteed” forward compatibility).If you don’t have it, then since your doubles are IEEE 64-bit, you can just steal the value from someone else’s float.h. Here’s the first one I found:
http://opensource.apple.com/source/gcc/gcc-937.2/float.h
#define DBL_EPSILON 2.2204460492503131e-16The value looks about right to me, but if you want to be sure on your compiler, you could check that
(1.0 + DBL_EPSILON) != 1.0 && (1.0 + DBL_EPSILON/2) == 1.0Edit: I’m not quite sure what you mean by “programmatically”. It’s a standard constant, you aren’t supposed to calculate it, it’s a property of the implementation given to you in a header file. But I guess you could do something like this. Again, assuming IEEE representation or something like it, so that DBL_EPSILON is bound to be whatever power of 0.5 represents a 1 in the last bit of precision of the representation of 1.0:
Beware that depending on compiler settings, intermediate results might have higher precision than
double, in which case you’d get a smaller result fordthanDBL_EPSILON. Check your compiler manual, or find a way to force the value of1.0 + d/2to be stored and reloaded to an actualdoubleobject before you compare it to1.0. Very roughly speaking, on PCs it depends on whether your compiler uses the x86 FPU instructions (higher precision), or newer x64 floating point ops (double precision).