28558dca80
Build / Build and test on ubuntu-24.04-arm for aarch64 (push) Waiting to run
Build / Build and test on windows-11-arm for aarch64 (push) Waiting to run
Build / Build and test on macos-latest for x86_64 (push) Waiting to run
Build / Build and test on windows-latest for x86_64 (push) Waiting to run
Build / Build and test on ubuntu-latest for x86_64 (push) Failing after 1s
Build / Build and test on ubuntu-latest (numpy 1.26) for x86_64 (push) Failing after 0s
103 lines
1.9 KiB
C++
103 lines
1.9 KiB
C++
#ifndef NUMEXPR_MISSING_POSIX_FUNCTIONS_HPP
|
|
#define NUMEXPR_MISSING_POSIX_FUNCTIONS_HPP
|
|
|
|
/*********************************************************************
|
|
Numexpr - Fast numerical array expression evaluator for NumPy.
|
|
|
|
License: MIT
|
|
Author: See AUTHORS.txt
|
|
|
|
See LICENSE.txt for details about copyright and rights to use.
|
|
**********************************************************************/
|
|
|
|
/* These functions are not included in some non-POSIX compilers,
|
|
like MSVC 7.1 */
|
|
|
|
|
|
/* Double precision versions */
|
|
|
|
inline double log1p(double x)
|
|
{
|
|
double u = 1.0 + x;
|
|
if (u == 1.0) {
|
|
return x;
|
|
} else {
|
|
return log(u) * x / (u-1.0);
|
|
}
|
|
}
|
|
|
|
inline double expm1(double x)
|
|
{
|
|
double u = exp(x);
|
|
if (u == 1.0) {
|
|
return x;
|
|
} else if (u-1.0 == -1.0) {
|
|
return -1;
|
|
} else {
|
|
return (u-1.0) * x/log(u);
|
|
}
|
|
}
|
|
|
|
inline double asinh(double xx)
|
|
{
|
|
double x, d;
|
|
int sign;
|
|
if (xx < 0.0) {
|
|
sign = -1;
|
|
x = -xx;
|
|
}
|
|
else {
|
|
sign = 1;
|
|
x = xx;
|
|
}
|
|
if (x > 1e8) {
|
|
d = x;
|
|
} else {
|
|
d = sqrt(x*x + 1.0);
|
|
}
|
|
return sign*log1p(x*(1.0 + x/(d+1.0)));
|
|
}
|
|
|
|
inline double acosh(double x)
|
|
{
|
|
return 2*log(sqrt((x+1.0)/2)+sqrt((x-1.0)/2));
|
|
}
|
|
|
|
inline double atanh(double x)
|
|
{
|
|
/* This definition is different from that in NumPy 1.3 and follows
|
|
the convention of MatLab. This will allow for double checking both
|
|
approaches. */
|
|
return 0.5*log((1.0+x)/(1.0-x));
|
|
}
|
|
|
|
|
|
/* Single precision versions */
|
|
|
|
inline float log1pf(float x)
|
|
{
|
|
return (float) log1p((double)x);
|
|
}
|
|
|
|
inline float expm1f(float x)
|
|
{
|
|
return (float) expm1((double)x);
|
|
}
|
|
|
|
inline float asinhf(float x)
|
|
{
|
|
return (float) asinh((double)x);
|
|
}
|
|
|
|
inline float acoshf(float x)
|
|
{
|
|
return (float) acosh((double)x);
|
|
}
|
|
|
|
inline float atanhf(float x)
|
|
{
|
|
return (float) atanh((double)x);
|
|
}
|
|
|
|
#endif // NUMEXPR_MISSING_POSIX_FUNCTIONS_HPP
|