I reduced my problem to the following code: int main (void) { double x;
x = 1 / 3.; __builtin_printf ("%.30lg %.30lg\n", __builtin_remainder(1., 1/3.), 1/3.); __builtin_printf ("%.30lg %.30lg\n", __builtin_remainder(1., x), x); } This calls __builtin_remainder() twice, once with constant arguments, once with a variable. Without rounding math, the two results agree (5.55e-17), but with -frounding-math, the constant case changes (-2.71e-20). On x86_64-apple-darwin, things are even weirder than x86_64-linux (the above): constant-case with -frounding-math -m64 is unchanged, while constant case with -frounding-math -m32 follows the linux results. I don’t think this is right, since remainder() is supposed to be unaffected by the rounding mode. Yet, before I open a PR, I wanted to see if someone understands what’s going on… Any ideas? FX