Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 28 Oct 2002 20:11:11 -0600 (CST)
From:      Loren James Rittle <rittle@latour.rsch.comm.mot.com>
To:        current@freebsd.org
Cc:        bde@zeta.org.au, imp@bsdimp.com, dschultz@uclink.Berkeley.EDU
Subject:   Re: Lack of real long double support (was Re: libstdc++ does not contain fabsl symbol)
Message-ID:  <200210290211.g9T2BBcP010112@latour.rsch.comm.mot.com>
In-Reply-To: <20021025182223.D3076-100000@gamplex.bde.org> (message from Bruce Evans on Fri, 25 Oct 2002 19:01:12 %2B1000 (EST))
References:   <20021025182223.D3076-100000@gamplex.bde.org>

next in thread | previous in thread | raw e-mail | index | archive | help
In article <20021025182223.D3076-100000@gamplex.bde.org>,
Bruce Evans<bde@zeta.org.au> writes:

>> If you really want, I can tell RTH that FreeBSD/i386 absolutely wants
>> `long double' to be:

>> 53 mantissa bits
>> 1024 max exponent

> No need.  I prefer to keep the 53-bit precision for now, but fix the
> exponents.

OK.  This was the resolution that made sense to us on the gcc side
(RTH, quickly; myself, some time to get up to speed).  FYI, the system
header patch that was actually checked in claims 64-bit precision.  Oh
well, at least the exponents are now correct.  ;-)  FYI, here is the
exact test case which shows the new value for LDBL_EPSILON (derived
directly from LDBL_MANT_DIG) is wrong verses the hardware default:

#include <float.h>

// Force run-time computation of math (beware, inlining oneld will defeat this).
long double oneld() { return 1.0L; }

main ()
{
  long double a = oneld();
  long double b = oneld() + LDBL_EPSILON;
  if (a == b) abort ();
}

On ref5 against gcc 3.2.X (as installed as system compiler), with the
latest <float.h>, it crashes.  By specification, this is one FP test
involving exact equality that is guaranteed to work (and report false,
in this case).

> Hopefully the precision won't be hard-coded into gcc in such
> a way as to completely break changing the precision at runtime.  I think
> it should affect (only) constant folding.  The issues are very similar
> to the ones with changing the rounding mode at runtime (C99 compilers
> shouldn't do constant folding in "#pragma STDC FENV_ACCESS ON" sections
> if the correct result might depend on the FP environment).

This exchange has been quite useful.  I see that issue.
Unfortunately, changing precision of the FP hardware would seem to
change the value of epsilon that is exported, both in classic C
headers and C++ <limits> (the latter being how I originally took any
interest in this matter since a C++ test case started failing after
the new real.c code was installed).

gcc 3.3 will support a framework in which such changes would be easy
to convey at compile-time but, to my knowledge, there is no support
yet to obtain e.g. the precision setting at run-time.  I.e. <float.h>
is now completely dynamically created at compile-time based on the
exact knowledge within gcc of the FP hardware; but it is static
w.r.t. eventual run-time.  It does not know how to effectively export
a function ala FreeBSD/alpha's <float.h>:

#define FLT_ROUNDS      __flt_rounds()

One issue, the standard says that various macros related to float
limits are constant expressions (as may be used to influence the
preprocessor?).  The above construct doesn't conform but I understand
the intent.

I will advise RTH about that type of issue.  Fortunately, in this
case, I think advertising 53-bit precision but really using 64-bit
precision (i.e. application code overrode system default) doesn't
invalidate the advertised epsilon, in terms of how it is used by the
application.

More generally, I will ask if gcc can support these details as gained
from the run-time environment instead of hard-coded defaults.  This
would be useful for all free OSes not just FreeBSD running on hardware
with such "flexible" FP hardware.

Any more comments, before I start work on the gcc mainline side of
things?

Thanks,
Loren

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200210290211.g9T2BBcP010112>