On x86, expm1l (-LDBL_MAX) returns NaN and raises INVALID and OVERFLOW exceptions; it should return -1 without raising those exceptions. Testcase: #include <errno.h> #include <fenv.h> #include <math.h> #include <stdio.h> #include <float.h> volatile long double d = -LDBL_MAX; int main (void) { feclearexcept (FE_ALL_EXCEPT); errno = 0; volatile long double r = expm1l (d); if (fetestexcept (FE_DIVBYZERO)) printf ("DIVBYZERO "); if (fetestexcept (FE_INEXACT)) printf ("INEXACT "); if (fetestexcept (FE_INVALID)) printf ("INVALID "); if (fetestexcept (FE_OVERFLOW)) printf ("OVERFLOW "); if (fetestexcept (FE_UNDERFLOW)) printf ("UNDERFLOW "); printf ("%.18Lg %m\n", r); return 0; }
Fixed by: commit 495fd99f3a119e5c0c542ccc6cf9c93b1fb9e892 Author: Joseph Myers <joseph@codesourcery.com> Date: Mon May 7 19:13:08 2012 +0000 Fix x86/x86_64 expm1l inaccuracy and exceptions (bugs 13885, 13923).