[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