public inbox for linux-ia64@vger.kernel.org
 help / color / mirror / Atom feed
* [Linux-ia64] gcc type promotion bug?
@ 2002-04-16 20:00 Richard Hirst
  2002-04-16 20:31 ` Andreas Schwab
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Richard Hirst @ 2002-04-16 20:00 UTC (permalink / raw)
  To: linux-ia64

#include <stdio.h>

int
main(int argc, char **argv)
{
        long a = 0x70000037L;
        float f = 0.01;
        long b = a + 1L/f;

        printf("%lx, %lx\n", b, a + 100L);
        return 0;
}



In the above, 1/f = 100, so the two numbers printed out should be the
same.  For me it prints out "70000080, 7000009b".  Same for gcc 2.96
and 3.0.3.

By trying various numbers for 'a', it appears to me that it is demoting
'a' to a float when evaluating 'b', thus truncating it to 24 significant
bits.  I thought all mixed mode arithmetic was supposed to be promoted
to doubles for evaluation.  This is breaking parted 1.6 on ia64.

Richard



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Linux-ia64] gcc type promotion bug?
  2002-04-16 20:00 [Linux-ia64] gcc type promotion bug? Richard Hirst
@ 2002-04-16 20:31 ` Andreas Schwab
  2002-04-16 20:36 ` Richard Hirst
  2002-04-16 20:58 ` Andreas Schwab
  2 siblings, 0 replies; 4+ messages in thread
From: Andreas Schwab @ 2002-04-16 20:31 UTC (permalink / raw)
  To: linux-ia64

Richard Hirst <rhirst@linuxcare.com> writes:

|> #include <stdio.h>
|> 
|> int
|> main(int argc, char **argv)
|> {
|>         long a = 0x70000037L;
|>         float f = 0.01;
|>         long b = a + 1L/f;
|> 
|>         printf("%lx, %lx\n", b, a + 100L);
|>         return 0;
|> }
|> 
|> 
|> 
|> In the above, 1/f = 100, so the two numbers printed out should be the
|> same.  For me it prints out "70000080, 7000009b".  Same for gcc 2.96
|> and 3.0.3.
|> 
|> By trying various numbers for 'a', it appears to me that it is demoting
|> 'a' to a float when evaluating 'b', thus truncating it to 24 significant
|> bits.  I thought all mixed mode arithmetic was supposed to be promoted
|> to doubles for evaluation.

No.  There are no operands of type double or long double involved, so the
ususal arithmetic conversions (6.3.1.8) choose float as the common type:

    Otherwise, if the corresponding real type of either operand is float,
    the other operand is converted, without change of type domain, to a
    type whose corresponding real type is float.

Andreas.

-- 
Andreas Schwab, SuSE Labs, schwab@suse.de
SuSE GmbH, Deutschherrnstr. 15-19, D-90429 Nürnberg
Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Linux-ia64] gcc type promotion bug?
  2002-04-16 20:00 [Linux-ia64] gcc type promotion bug? Richard Hirst
  2002-04-16 20:31 ` Andreas Schwab
@ 2002-04-16 20:36 ` Richard Hirst
  2002-04-16 20:58 ` Andreas Schwab
  2 siblings, 0 replies; 4+ messages in thread
From: Richard Hirst @ 2002-04-16 20:36 UTC (permalink / raw)
  To: linux-ia64

On Tue, Apr 16, 2002 at 10:31:02PM +0200, Andreas Schwab wrote:
> No.  There are no operands of type double or long double involved, so the
> ususal arithmetic conversions (6.3.1.8) choose float as the common type:
> 
>     Otherwise, if the corresponding real type of either operand is float,
>     the other operand is converted, without change of type domain, to a
>     type whose corresponding real type is float.

OK, thanks.  I looked at (out of date) K&R, which told me all floating
point arithmetic in C was done in double precision, and I tried my
program on i386, where it appeared to worked fine.

Cheers,
  Richard



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Linux-ia64] gcc type promotion bug?
  2002-04-16 20:00 [Linux-ia64] gcc type promotion bug? Richard Hirst
  2002-04-16 20:31 ` Andreas Schwab
  2002-04-16 20:36 ` Richard Hirst
@ 2002-04-16 20:58 ` Andreas Schwab
  2 siblings, 0 replies; 4+ messages in thread
From: Andreas Schwab @ 2002-04-16 20:58 UTC (permalink / raw)
  To: linux-ia64

Richard Hirst <rhirst@linuxcare.com> writes:

|> On Tue, Apr 16, 2002 at 10:31:02PM +0200, Andreas Schwab wrote:
|> > No.  There are no operands of type double or long double involved, so the
|> > ususal arithmetic conversions (6.3.1.8) choose float as the common type:
|> > 
|> >     Otherwise, if the corresponding real type of either operand is float,
|> >     the other operand is converted, without change of type domain, to a
|> >     type whose corresponding real type is float.
|> 
|> OK, thanks.  I looked at (out of date) K&R, which told me all floating
|> point arithmetic in C was done in double precision, and I tried my
|> program on i386, where it appeared to worked fine.

The standard explicitly allows for using a higher precision and range for
floating point computation than those of the nominal type.

Andreas.

-- 
Andreas Schwab, SuSE Labs, schwab@suse.de
SuSE GmbH, Deutschherrnstr. 15-19, D-90429 Nürnberg
Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2002-04-16 20:58 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-04-16 20:00 [Linux-ia64] gcc type promotion bug? Richard Hirst
2002-04-16 20:31 ` Andreas Schwab
2002-04-16 20:36 ` Richard Hirst
2002-04-16 20:58 ` Andreas Schwab

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox