math: fix sinh overflows in non-nearest rounding
authorSzabolcs Nagy <nsz@port70.net>
Mon, 20 Jan 2020 20:38:45 +0000 (20:38 +0000)
committerRich Felker <dalias@aerifal.cx>
Sat, 22 Feb 2020 04:42:12 +0000 (23:42 -0500)
commitd20558148d8a2c52229b02668627697e83ca3840
treee4f3373bb8649db621bfeb871ed335e13886b343
parentb3797d3b2e10e6fff2a6b04af917e61e95838b08
math: fix sinh overflows in non-nearest rounding

The final rounding operation should be done with the correct sign
otherwise huge results may incorrectly get rounded to or away from
infinity in upward or downward rounding modes.

This affected sinh and sinhf which set the sign on the result after
a potentially overflowing mul. There may be other non-nearest rounding
issues, but this was a known long standing issue with large ulp error
(depending on how ulp is defined near infinity).

The fix should have no effect on sinh and sinhf performance but may
have a tiny effect on cosh and coshf.
src/internal/libm.h
src/math/__expo2.c
src/math/__expo2f.c
src/math/cosh.c
src/math/coshf.c
src/math/sinh.c
src/math/sinhf.c