Boost logo

Boost :

From: Matthias Troyer (troyer_at_[hidden])
Date: 2005-12-04 14:44:35


On Dec 3, 2005, at 8:09 PM, John Maddock wrote:

>> ld = hi + low as above is not among the bit patterns he lists as
>> valid. If you apply the definition of epsilon to the "normal" long
>> doubles only, then you get a value like the one Paul Bristow computed
>> for NTL's quad_float.
>
> I agree: that explanation is quite explicit when it says it follows
> Kahan's
> "double double" and the IEEE spec. So the low part must be
> normalised so
> that it's bit's "follow on" from those in the high part. As it
> stands,
> 1+numeric_limits<>::epsilon() should evaluate to 1, but we really
> need to
> check this out. Does anyone of a numerical inclination, want to
> run some
> tests on Darwin?

Since i asked the students in my class to write a program calculating
the machine epsilon as a homework, I just ran our solution (posted at
http://www.itp.phys.ethz.ch/lectures/PT/Exercises/Uebung1/Solution/
eps.cpp). Please overlook that the code is ugly, and does not use any
templates - they just had one week of C++ training. Anyway, this code:

long double epsilon_long_double() {
   long double eps = 1.;
   long double onepluseps;

   do {
     eps /= 2;
     onepluseps = 1. + eps;
   } while ( onepluseps != 1.);

   return 2*eps;

}

returns 0, hence there is really the problem that numeric_limits<long
double>::epsilon() == numeric_limits<long double>::min()

Matthias


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk