What the hell is going on? Just a simple division...

David Wragg dpw@doc.ic.ac.uk
Fri Dec 24 11:00:00 GMT 1999


"Paul E.C. Melis" <melis@cs.utwente.nl> writes:
> Using gcc-2.95.2 and linux 2.0.35 (libc5) the
> following program gives as output
>     0
>     1
> instead of the obviously correct output
>     1
>     1
> Is this a compiler bug?

No. Just a pitfall of floating point on x86.

>     printf ("%d\n", (int) ( log(2.0) / log(2.0) ));

Look at the generated assembly. One "log(2.0)" gets evaluated to a
double held in an 80-bit FP register. This is then transfered to a
64-bit double in memory, causing it to be rounded. The other
"log(2.0)" is then evaluated to a double held in an 80-bit bit FP
register. The division is then performed. Since only one value was
rounded, the result will not be 1.0, and so on conversion to int may
be truncated to 0.


David Wragg


More information about the Gcc-help mailing list