https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99048
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jakub at gcc dot gnu.org
--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
a = -2.5118280672773279e+307
c = 1.7976931348623157e+308
c is in particular the maximum normalized number, __DBL_MAX__, binary
0x7fefffffffffffff.
126 z = a + c;
z = 1.546510328134583e+308
and that is finite.
144 q = a - z;
But this is -inf.
145 zz = q + c + (a - (q + z)) + aa + cc;
and everything goes downhill from there, as a, c, z, aa and cc are all finite,
but q is -inf and a - (-inf + finite) is +inf and -inf + +inf is nan.
So, the code:
z = a + c;
if (nonfinite (z))
{
...
}
else
{
q = a - z;
would need another if (nonfinite (q)) check after computation of q (and I don't
believe it could just compute q = a - z; right after z = a + c; and replace if
(nonfinite (z)) with if (nonfinite (q)) because if a is +-inf and c is finite,
z will be +-inf and q will be nan.