standards/130067: Wrong numeric limits in system headers?

David Schultz das at FreeBSD.ORG
Fri Jan 9 18:41:17 UTC 2009


On Fri, Jan 09, 2009, John Hein wrote:
> FWIW, when you compile the OP's sample code on i386 with -pedantic
> (with 6.x's base gcc 3.4.6 or 7.x's base gcc 4.2.1), you get:
> 
> x.cc:11: error: floating constant exceeds range of 'long double'
> 
> (the LDBL_MAX line)
> 
> That seems to tip the scale more to the 'float.h is wrong' side.

gcc doesn't do quite the right thing with long double constants in
FreeBSD, and it causes no end of trouble when writing long double
routines that are intended to work when the FPU is switched to
extended precision mode.

Older versions of gcc would evaluate long double constant
expressions at compile time using extended precision, which was
wrong because it didn't reflect what the FPU would have done at
runtime. More recent versions of gcc were "fixed" to evaluate all
long double constants using double precision, which matches what
the FPU does by default. However, now it's not even possible to
write a program that uses long double constants, even if the
program changes the FPU precision at runtime, because gcc
truncates all the constants at compile time (and generates
spurious complaints such as the one you mention). C99 defines some
pragmas that would improve the situation, but gcc doesn't
implement them.


More information about the freebsd-standards mailing list