https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94212
Qian Jianhua <qianjh at cn dot fujitsu.com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |qianjh at cn dot fujitsu.com --- Comment #10 from Qian Jianhua <qianjh at cn dot fujitsu.com> --- I simplified the testcase as below. ---------------------------------- #include <stdio.h> #define POLY(arg) (1.0d - 2.0d * arg + 3.0d * arg * arg - 4.0 * arg * arg * arg) double v[2]={1000006.0d,1000008.0d}; int main(int argc, char** argv) { double res = 0.0d; res = v[1]*POLY(v[0]); printf("RESULT:%lf\n", res); return 0;; } ---------------------------------- The result is also different with/without -ffp-contract=off. Assembly has no problem. So I think there are differences in FP accuracy between mul+add and fmadd. They are not equivalent for some specific numbers.