math: Use sinh from CORE-MATH
The current implementation precision shows the following accuracy, on
three ranges ([-DBL_MAX,-10], [-10,10], [10,DBL_MAX]) with 10e9 uniform
randomly generated numbers for each range (first column is the
accuracy in ULP, with '0' being correctly rounded, second is the
number of samples with the corresponding precision):
* Range [-DBL_MAX, -10]
* FE_TONEAREST
0:
10000000000 100.00%
* FE_UPWARD
0:
10000000000 100.00%
* FE_DOWNWARD
0:
10000000000 100.00%
* FE_TOWARDZERO
0:
10000000000 100.00%
* Range [-10, -10]
* FE_TONEAREST
0:
3169388892 73.79%
1:
1125270674 26.20%
2: 307729 0.01%
* FE_UPWARD
0:
1450068660 33.76%
1:
2146926394 49.99%
2:
697404986 16.24%
3: 567255 0.01%
* FE_DOWNWARD
0:
1449727976 33.75%
1:
2146957381 49.99%
2:
697719649 16.25%
3: 562289 0.01%
* FE_TOWARDZERO
0:
2519351889 58.66%
1:
1773434502 41.29%
2:
2180904 0.05%
* Range [10, DBL_MAX]
* FE_TONEAREST
0:
10000000000 100.00%
* FE_UPWARD
0:
10000000000 100.00%
* FE_DOWNWARD
0:
10000000000 100.00%
* FE_TOWARDZERO
0:
10000000000 100.00%
The CORE-MATH implementation is correctly rounded for any rounding mode.
The code was adapted to glibc style and to use the definition of
math_config.h (to handle errno, overflow, and underflow).
Performance-wise, it shows:
latency master patched improvement
x86_64 101.0710 129.4710 -28.10%
x86_64v2 101.1810 127.6370 -26.15%
x86_64v3 96.0685 48.5911 49.42%
aarch64 41.4229 22.3971 45.93%
armhf-vpfv4 42.8620 25.6011 40.27%
powerpc64le 29.2630 13.1450 55.08%
reciprocal-throughput master patched improvement
x86_64 42.6895 105.7150 -147.64%
x86_64v2 42.7255 104.7480 -145.17%
x86_64v3 39.6949 25.9087 34.73%
aarch64 26.0104 19.2236 26.09%
armhf-vpfv4 29.4362 23.6350 19.71%
powerpc64le 12.9170 8.34582 35.39%
* x86_64: gcc version 15.2.1
20260112, Ryzen 9 5900X, --disable-multi-arch
* aarch64: gcc version 15.2.1
20251105, Neoverse-N1
* armv7a-vpfv4: gcc version 15.2.1
20251105, Neoverse-N1
* powerpc64le: gcc version 15.2.1
20260128, POWER10
Checked on x86_64-linux-gnu, aarch64-linux-gnu, and
powerpc64le-linux-gnu.
Reviewed-by: DJ Delorie <dj@redhat.com>