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