https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118016
Bug ID: 118016
Summary: GCC adds excess precision to floating point literals,
and therefore rounds incorrectly (x87 FPU,
-fexcess-precision=standard)
Product: gcc
Version: 14.2.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: geza.herman at gmail dot com
Target Milestone: ---
Maybe this is not a bug, but still it is unexpected behavior.
If this program is compiled with "-m32 -fexcess-precision=standard", the
program returns 0, meaning that 4.1 is not equal to 4.1
(https://godbolt.org/z/5PGaa5sKe):
int main() {
double v = 1.1;
return v == 1.1;
}
The reason is that the 1.1 literal represented with excess precision. We may
say that this OK (allowed by the standard?). Now, see this example
(https://godbolt.org/z/sv3EaoEKE):
#include <stdio.h>
int main() {
double v = 9000000000000001.499999;
printf("%f\n", v);
}
This program prints 9000000000000002.000000, instead of the closer value of
9000000000000001.000000. This problem happens because of double rounding (the
literal first rounded to long double, then to double). I would not expect that
'v' won't receive the closest possible value to the literal.
There is a stackoverflow thread about this:
https://stackoverflow.com/questions/79273119/why-does-gcc-compare-seemingly-equal-floating-point-values-as-different-with-f