[libc] Improve the performance of expf.
authorTue Ly <lntue@google.com>
Thu, 24 Mar 2022 22:07:46 +0000 (18:07 -0400)
committerTue Ly <lntue@google.com>
Fri, 25 Mar 2022 16:20:20 +0000 (12:20 -0400)
commit6168b422258e41087a5393b7b77a7349a8922a68
tree58e363234087743b3ceb4a3b46db5c790630aa22
parent39d348c602f08da2505d51f3b224f4ff057207db
[libc] Improve the performance of expf.

Reduce the polynomial's degree from 7 down to 4.

Currently we use a degree-7 minimax polynomial on an interval of length 2^-7
around 0 to compute `expf`. Based on the suggestion of @santoshn and the RLIBM
project (https://github.com/rutgers-apl/rlibm-all/blob/main/source/float/exp.c)
and the improvement we made with `exp2f` in https://reviews.llvm.org/D122346,
it is possible to have a good polynomial of degree-4 on a subinterval of length
2^(-7) to approximate e^x.

We did try to either reduce the degree of the polynomial down to 3 or increase
the interval size to 2^(-6), but in both cases the number of exceptional values
exploded. So we settle with using a degree-4 polynomial of the interval of
size 2^(-7) around 0.

Reviewed By: sivachandra, zimmermann6, santoshn

Differential Revision: https://reviews.llvm.org/D122418
libc/src/math/generic/expf.cpp
libc/test/src/math/exhaustive/expf_test.cpp
libc/test/src/math/expf_test.cpp