[vox-tech] location of DBL_EPSILON definition
Boris Jeremic
jeremic at ucdavis.edu
Fri Jan 26 09:04:52 PST 2007
on my machine (fedora core 5) there are definitions in
./usr/lib/gcc-lib/i386-redhat-linux/3.2.3/include/float.h
/* Difference between 1.0 and the minimum double greater than 1.0 */
#undef DBL_EPSILON
#define DBL_EPSILON 2.2204460492503131e-16
but not in
./usr/lib/gcc/i386-redhat-linux/4.1.0/include/float.h
where it appears as:
/* The difference between 1 and the least value greater than 1 that is
representable in the given floating point type, b**1-p. */
#undef FLT_EPSILON
#undef DBL_EPSILON
#undef LDBL_EPSILON
#define FLT_EPSILON __FLT_EPSILON__
#define DBL_EPSILON __DBL_EPSILON__
#define LDBL_EPSILON __LDBL_EPSILON__
You can also calculate them yourself:
//##############################################################################
double d_macheps()
{
double eps = 1.0;
int counter = 1;
while ( ((double) 1.0 + eps) > ((double) 1.0) )
{
eps = eps/2.0;
counter++;
// ::printf("eps = %.16e counter = %7d \n",eps,counter);
}
eps = eps*2.0;
counter--;
// ::printf("\n double macheps = %.20e at counter = %d \n",eps,counter);
return eps;
}
Of course on x86 machines all floats, doubles and long doubles get promoted to
long double (inside the CPU) so from the above calculation you will get macheps
for long double. This might be OK , but one has to be carefull....
Boris
Peter Jay Salzman wrote:
> Where is DBL_EPSILON defined? I thought it was in float.h. But I've looked
> at float.h in:
>
> /usr/lib/gcc-lib/i486-linux-gnu/3.3.6/include
> /usr/lib/gcc/i486-linux-gnu/3.4.6/include
>
> and neither one actually defined it.
>
> Where is the numerical value held?
> _______________________________________________
> vox-tech mailing list
> vox-tech at lists.lugod.org
> http://lists.lugod.org/mailman/listinfo/vox-tech
>
More information about the vox-tech
mailing list