math: fix __rem_pio2 in non-nearest rounding modes
commitb3797d3b2e10e6fff2a6b04af917e61e95838b08
authorSzabolcs Nagy <nsz@port70.net>
Sat, 18 Jan 2020 17:55:25 +0000 (18 17:55 +0000)
committerRich Felker <dalias@aerifal.cx>
Sat, 22 Feb 2020 04:42:05 +0000 (21 23:42 -0500)
tree31e7b1858b566167f4303bbeab58d6074549e321
parent040c1d16b468c50c04fc94edff521f1637708328
math: fix __rem_pio2 in non-nearest rounding modes

Handle when after reduction |y| > pi/4+tiny. This happens in directed
rounding modes because the fast round to int code does not give the
nearest integer. In such cases the reduction may not be symmetric
between x and -x so e.g. cos(x)==cos(-x) may not hold (but polynomial
evaluation is not symmetric either with directed rounding so fixing
that would require more changes with bigger performance impact).

The fix only adds two predictable branches in nearest rounding mode,
simple ubenchmark does not show relevant performance regression in
nearest rounding mode.

The code could be improved: e.g reducing the medium size threshold
such that two step reduction is enough instead of three, and the
single precision case can avoid the issue by doing the round to int
differently, but this fix was kept minimal.
src/math/__rem_pio2.c
src/math/__rem_pio2f.c
src/math/__rem_pio2l.c