This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

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


"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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]