https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81906
Alexander Monakov <amonakov at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |amonakov at gcc dot gnu.org --- Comment #12 from Alexander Monakov <amonakov at gcc dot gnu.org> --- [my comment collided with Joseph's, I'm pointing out that one additional copysign is sufficient under -frounding-math) I think this expansion works as intended for to-nearest and towards-zero rounding modes, and swaps upwards and downwards rounding for negative operands. Which implies that under -frounding-math the approach is fixable by swapping signs of the 2**52 operands: xa = fabs (operand1); a2_52 = 2**52; [if flag_rounding_math] a2_52 = copysign (a2_52, operand1); xa = xa + a2_52 - a2_52; return copysign (xa, operand1);