Date: Fri, 25 Oct 2002 19:01:12 +1000 (EST) From: Bruce Evans <bde@zeta.org.au> To: Loren James Rittle <rittle@latour.rsch.comm.mot.com> Cc: current@freebsd.org Subject: Re: Lack of real long double support (was Re: libstdc++ does not contain fabsl symbol) Message-ID: <20021025182223.D3076-100000@gamplex.bde.org> In-Reply-To: <200210242347.g9ONlJqk036023@latour.rsch.comm.mot.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, 24 Oct 2002, Loren James Rittle wrote: > >> ... Anyways, that work exposed some issues. > ... > It is easy to generate, with arithmetic, a long double value outside > the *exponent* range above no matter how the precision is set; it is > not truncated to Inf until it is actually cast to a double (as is > currently done just before a long double is printed with stdio). See > below for a program that demonstrates this behavior. > > >> Yet, the FP hardware is actually configured by default to provide > >> `long double' as: > > >> #define LDBL_MANT_DIG 53 > > > I think you mean 64 (the hardware default). > > No sir, I did mean as configured in the system startup code, it is > forced to 53-bits (that choice affects long double as well as double). > But there are no IEEE control bits to limit the size of the exponent > field, are there? Thus, the following describes the exact size of the > HW's exponent field of a long double as configured by default: > > >> #define LDBL_MIN_EXP (-16381) > >> #define LDBL_MAX_EXP 16384 > > > gcc can't actually support the full range, since it doesn't control > > the runtime environement (it could issue a fninit before main() to > > change the default, but it shouldn't and doesn't). The exponent > > range is lost long before printf() is reached. E.g., > > > long double x= DBL_MAX; > > long double y = 2 * x; > > > gives +Inf for y since the result is doesn't fit in 53-bit precision. > > As you know, the selection of maximum precision is orthogonal to the > number of bits used for the exponent. > > I do wish you were correct. Have you looked at the raw memory of y? > It is *not* the bit pattern for +Inf. If y were +Inf, then based on > the properties of IEEE math, the following would report Inf not > DBL_MAX/2: Oops. I did look at the bits, but I looked more closely at gdb's display of the value which is broken (it says +inf). Apparently gdb uses the host's FP too much. > #include <float.h> > int main (void) > { > long double x= LDBL_MAX; // Same as DBL_MAX in current float.h > long double y = 2e100 * x; // If LDBL_MAX was correct, we should latch Inf. > long double z = y / 4e100; > printf ("%Lg\n", z); > } > > It does, in fact, report DBL_MAX/2 with the system compiler on FreeBSD > 4. FYI, I reviewed the generated code to ensure it was using run-time > calculations not compile-time calculations. I'd call that a rather > easy time getting a normalized long double much larger than > LDBL_MAX/DBL_MAX. This test alone proves in my mind that the > <float.h> system header for i386 is itself wrong. Yes, this example is as convincing as examining the (right :) bits. > > The system header correctly reports this default precision. Any header > > genrated by the gcc build should be no different, since the build should > > run in the target environment. > > I agree that the precision setting in the system header is fine. The > size of the exponent field is buggy. I held the opinion you have but > while trying to convince RTH (the guy that rewrote gcc FP support), I > did enough research that also leads me to think that it is the header > itself which is buggy. > > 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. 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). > > It should use whatever is the default format for the host environment, > > It still has enquire.c for doing this automatically. [...] > > I fear I didn't explain clearly enough. enquire.c is completely > *gone* in gcc 3.3. This is why gcc needs to fully understand the > exact FP default configuration. As you noted, enquire.c was buggy. Ah. I was a little surprised to find it still in 3.2. It is not so much buggy as dysfunctional in a cross compiler. It has to run on the target somehow to work. Bruce 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?20021025182223.D3076-100000>