Boost logo

Boost :

From: Christoph Ludwig (cludwig_at_[hidden])
Date: 2005-12-03 11:38:23

On Fri, Dec 02, 2005 at 07:45:02PM -0000, John Maddock wrote:
> On Darwin numeric_limits<>::epsilon returns something like 10^-303 which is
> the same as the value for numeric_limts<>::min() I believe. It's just plain
> crazy, all IMO of course :-)

I tend to agree Darwin's choice of numeric_limits<long double>::epsilon is
wrong; it is certainly likely to cause problems for numerical code.
I think I see where this value comes from, though: According to section of the C++ standard, numeric_limits<T>::epsilon() is

  Machine epsilon: the difference between 1 and the least value greater than 1
  that is representable.

The value of a long double ld on Darwin is, according to Geoffrey Keating's
explanation in the GCC tree <url:>, the sum of two
double; let's call them hi and low. If hi == 1.0 and low ==
numeric_limits<double>::min(), then ld == hi + low > 1.0. If you don't look
any further, then you have to conclude epsilon == low.

However, Geoffrey Keating lists under "Classification" all valid bit patterns
for a long double. He explicitly states:

  Many possible long double bit patterns are not valid long doubles.
  These do not represent any value.

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.



Boost list run by bdawes at, gregod at, cpdaniel at, john at