After upgrading to gcc 4.5.0 from 3.3.4, some of my floating point code fails. 
Searched for and could not find a matching bug.  It boils down to this very
simple example:

#include <stdio.h>

#define MY_PI   3.14159265358979323846

int main()
{
    double z = MY_PI;
    puts(z == MY_PI ? "==" : "!=");
    return 0;
}

If this is compiled "gcc -o bug -Wall bug.c" it works: there is equality. 
Doesn't matter if optimization is used or not (-g, -O, -O2 all give same
results).

But if compiled with -ansi or -std=c99, then the equality fails, again
regardless of optimization!!

The preprocessed code looks as expected:

int main()
{
    double z = 3.14159265358979323846;
    puts(z == 3.14159265358979323846 ? "==" : "!=");
    return 0;
}

Cannot see how this is correct behavior since the exact same expression was
used to initialize the variable and to test for equality.  Do not see anything
in my ANSI/ISO C reference that sheds any light.

I can work around this by using actual double constants instead of preprocessor
expressions ("double my_pi_2 = MY_PI_2" and setting/testing with my_pi_2, etc),
but this should work as is!


-- 
           Summary: Floating point comparison failure
           Product: gcc
           Version: 4.5.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: ian at macky dot net


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45691

Reply via email to