Date: Sat, 20 Mar 1999 00:39:05 +1000 From: Greg Black <gjb@comkey.com.au> To: spinner.rflab@t-online.de (Steffen Hein) Cc: freebsd-questions@FreeBSD.ORG Subject: Re: gnu C compiler Message-ID: <19990319143905.18703.qmail@alpha.comkey.com.au> In-Reply-To: <36F24371.37ACAF58@t-online.de> of Fri, 19 Mar 1999 12:30:41 GMT References: <36EFA9ED.5126E95C@t-online.de> <19990317210724.9018.qmail@alpha.comkey.com.au> <36F24371.37ACAF58@t-online.de>
next in thread | previous in thread | raw e-mail | index | archive | help
> > > How can you explain me that the same gnu C compiler ( release 2.7.2.1 )
> > > in FreeBSD apparently does not handle the long double format correctly
> > > while in Linux it does ?
>
> > Learn to use gcc's warnings (at the very least -Wall), and
> > you'll see where your code is incorrect.
>
> > printf( "\n LDBL_MIN = % Le ", LDBL_MIN );
> >
> > This is wrong, as gcc would have told you with -Wall: you are
> > passing a `double' to printf() but telling it you are passing a
> > `long double'. If you lie to the compiler, then it will get its
> > revenge.
> >
> > If you cast LDBL_MIN and friends to the correct type, then your
> > program will run to completion.
>
> The comment merely states that the gnu C compiler does not comply here
> with the ANSI standard, according to which the format instructions are
> legitimate.
You don't understand the Standard. In your code, you have used
the "%Le" conversion, which specifies that the relevant argument
will be a `long double'. However, the argument you provide, in
this particular example `LDBL_MIN', is -- despite its name -- not
a `long double' but a plain `double'. The only way to make it
the correct `long double' type is with a cast, e.g.:
printf( "\n LDBL_MIN = % Le ", (long double) LDBL_MIN );
> ( Cf. chapter 'The ANSI Runtime Library' in Darnell & Margolis, ISBN
> 0-387-97389-3, p.453, Springer )
I use the Standard, since other people's interpretations are
frequently wrong.
> - At any rate, Linux cooperates correctly.
I have never seen the Linux <float.h> file, so I don't know how
it defines `LDBL_MIN'. In any case, the Standard leaves the
definition somewhat open: it's an implementation-defined
expression whose value must be equal to or less than 1e-37. The
FreeBSD header has:
#define DBL_MIN 2.2250738585072014E-308
#define LDBL_MIN DBL_MIN
Those two lines comply with the Standard. Note that, if the
second line was:
#define LDBL_MIN 2.2250738585072014E-308L
your code would have been correct since, in this imaginary
definition, `LDBL_MIN' is a `long double'. But, since the real
definition has it as a `double', your code is wrong under
FreeBSD (and unwise under any implementation).
It's a mistake to imagine that the C Standard aims to be fully
prescriptive about the details of all these values. You have to
actually check them for each implementation, because the details
are specified as `implementation-defined'.
--
Greg Black <gjb@acm.org>
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-questions" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?19990319143905.18703.qmail>
