Description
Describe the bug
The exp
function (for SIMD and pure C) returns infinity for all values past a certain threshold, but this threshold is slightly lower than it should be. Looking at the code for double precision, infinity is returned for all x > 709.78271114955742909217217426
. However, there are values past this limit whose exponential can still be represented with a finite double. All standard libraries I've tested use the following, slightly larger, threshold instead x > 709.782712893384
(0x1.62e42fefa39efp+9
in binary). This doesn't appear to be an issue for the single precision implementation.
This same threshold is also used in the pow
function, so the bug is present there as well.
Command lines, logs and environment
All the build steps, environment and configuration are the same as in my other issue, #570, though they shouldn't matter in this case.
To Reproduce
int main()
{
double x = 709.782712;
std::cout << "libc: " << exp(x) << '\n';
std::cout << "Sleef: " << Sleef_exp_u10(x) << '\n';
}
This produces the following output on my machine
libc: 1.79769e+308
Sleef: inf
Fixing this issue might be as simple as just changing the constant in the implementation, provided the series is still accurate past this point.
Activity