#define _GNU_SOURCE /* Extra maths functions */
#include <math.h> /* Literally everything */
#include "alias.h" /* weak_alias */
#include "internal.h" /* GCOMPAT__assert_with_reason */
/**
* Multiplies the first argument x by FLT_RADIX (probably 2) to the power of y.
*/
long double scalbl(long double x, long double y)
{
/*
* XXX strictly not correct but:
* 1) Good Enough(TM)
* 2) scalbl is deprecated anyway
* */
return scalblnl(x, (long int) y);
}
/*
* The below require support for ynl/jnl which doesn't exist in musl and isn't
* implemented in gcompat yet
*/
#if 0
/**
* Return Bessel functions of x of the first kind of order n.
*/
long double jnl(int n, long double x)
{
/* TODO implement */
return 0;
}
/**
* Return Bessel functions of x of the first kind of order 0.
*/
long double j0l(long double n)
{
return jnl(0, n);
}
/**
* Return Bessel functions of x of the first kind of order 1.
*/
long double j1l(long double n)
{
return jnl(1, n);
}
/**
* Return Bessel functions of x of the second kind of order n.
*/
long double ynl(int n, long double x)
{
/* TODO implement */
return 0;
}
/**
* Return Bessel functions of x of the second kind of order 0.
*/
long double y0l(long double n)
{
return ynl(0, n);
}
/**
* Return Bessel functions of x of the second kind of order 1.
*/
long double y1l(long double n)
{
return ynl(1, n);
}
#endif
/**
* Test for finite value.
*/
int __finite(double arg)
{
return isfinite(arg);
}
weak_alias(__finite, finite);
/**
* Test for finite value.
*/
int __finitef(float arg)
{
return isfinite(arg);
}
weak_alias(__finitef, finitef);
/**
* Test for finite value.
*/
int __finitel(long double arg)
{
return isfinite(arg);
}
weak_alias(__finitel, finitel);
/**
* Test for infinity.
*
* LSB 5.0: LSB-Core-generic/baselib---isinf.html
*/
int __isinf(double arg)
{
return isinf(arg);
}
weak_alias(__isinf, isinf);
/**
* Test for infinity.
*
* LSB 5.0: LSB-Core-generic/baselib---isinff.html
*/
int __isinff(float arg)
{
return isinf(arg);
}
weak_alias(__isinff, isinff);
/**
* Test for infinity.
*
* LSB 5.0: LSB-Core-generic/baselib---isinfl.html
*/
int __isinfl(long double arg)
{
return isinf(arg);
}
weak_alias(__isinfl, isinfl);
/**
* Test for a NaN.
*
* LSB 5.0: LSB-Core-generic/baselib---isnan.html
*/
int __isnan(double arg)
{
return isnan(arg);
}
weak_alias(__isnan, isnan);
/**
* Test for a NaN.
*
* LSB 5.0: LSB-Core-generic/baselib---isnanf.html
*/
int __isnanf(float arg)
{
return isnan(arg);
}
weak_alias(__isnanf, isnanf);
/**
* Test for a NaN.
*
* LSB 5.0: LSB-Core-generic/baselib---isnanl.html
*/
int __isnanl(long double arg)
{
return isnan(arg);
}
weak_alias(__isnanl, isnanl);
/*
* Finite specialisations of functions used by glibc, that aren't supposed to
* return infinity.
*/
#define _ASSERT_FINITE(finite_fn, res) \
GCOMPAT__assert_with_reason(finite_fn(res), \
"infinite value returned in a function that returns a " \
"finite result");
#define ASSERT_FINITEF(res) _ASSERT_FINITE(finitef, res)
#define ASSERT_FINITE(res) _ASSERT_FINITE(finite, res)
#define ASSERT_FINITEL(res) _ASSERT_FINITE(finitel, res)
/**
* Returns the principal value of the arc cosine of x, expressed in radians.
*/
float __acosf_finite(float x)
{
float res = acosf(x);
ASSERT_FINITEF(res);
return res;
}
/**
* Returns the principal value of the arc cosine of x, expressed in radians.
*/
double __acos_finite(double x)
{
double res = acos(x);
ASSERT_FINITE(res);
return res;
}
/**
* Returns the principal value of the arc cosine of x, expressed in radians.
*/
long double __acosl_finite(long double x)
{
long double res = acosl(x);
ASSERT_FINITEL(res);
return res;
}
/**
* Returns the nonnegative area hyperbolic cosine of x.
*/
double __acosh_finite(double x)
{
double res = acosh(x);
ASSERT_FINITE(res);
return res;
}
/**
* Returns the nonnegative area hyperbolic cosine of x.
*/
float __acoshf_finite(float x)
{
float res = acoshf(x);
ASSERT_FINITEF(res);
return res;
}
/**
* Returns the nonnegative area hyperbolic cosine of x.
*/
long double __acoshl_finite(long double x)
{
long double res = acoshl(x);
ASSERT_FINITEL(res);
return res;
}
/**
* Returns the principal value of the arc sine of x, expressed in radians.
*/
float __asinf_finite(float x)
{
float res = asinf(x);
ASSERT_FINITEF(res);
return res;
}
/**
* Returns the principal value of the arc sine of x, expressed in radians.
*/
double __asin_finite(double x)
{
double res = asin(x);
ASSERT_FINITE(res);
return res;
}
/**
* Returns the principal value of the arc sine of x, expressed in radians.
*/
long double __asinl_finite(long double x)
{
long double res = asinl(x);
ASSERT_FINITEL(res);
return res;
}
/**
* Returns the principal value of the arc tangent of x/y, expressed in radians.
*/
float __atan2f_finite(float x, float y)
{
float res = atan2f(x, y);
ASSERT_FINITEF(res);
return res;
}
/**
* Returns the principal value of the arc tangent of x/y, expressed in radians.
*/
double __atan2_finite(double x, double y)
{
double res = atan2(x, y);
ASSERT_FINITE(res);
return res;
}
/**
* Returns the principal value of the arc tangent of x/y, expressed in radians.
*/
long double __atan2l_finite(long double x, long double y)
{
long double res = atan2l(x, y);
ASSERT_FINITEL(res);
return res;
}
/**
* Returns the area hyperbolic tangent of x.
*/
float __atanhf_finite(float x)
{
float res = atanhf(x);
ASSERT_FINITEF(res);
return res;
}
/**
* Returns the area hyperbolic tangent of x.
*/
double __atanh_finite(double x)
{
double res = atanh(x);
ASSERT_FINITE(res);
return res;
}
/**
* Returns the area hyperbolic tangent of x.
*/
long double __atanhl_finite(long double x)
{
long double res = atanhl(x);
ASSERT_FINITEL(res);
return res;
}
/**
* Returns the hyperbolic cosine of x.
*/
float __coshf_finite(float x)
{
float res = coshf(x);
ASSERT_FINITEF(res);
return res;
}
/**
* Returns the hyperbolic cosine of x.
*/
double __cosh_finite(double x)
{
double res = cosh(x);
ASSERT_FINITE(res);
return res;
}
/**
* Returns the hyperbolic cosine of x.
*/
long double __coshl_finite(long double x)
{
long double res = coshl(x);
ASSERT_FINITEL(res);
return res;
}
/**
* Return the value of 10 raised to the power of x.
*/
float __exp10f_finite(float x)
{
float res = exp10f(x);
ASSERT_FINITEF(res);
return res;
}
/**
* Return the value of 10 raised to the power of x.
*/
double __exp10_finite(double x)
{
double res = exp10(x);
ASSERT_FINITE(res);
return res;
}
/**
* Return the value of 10 raised to the power of x.
*/
long double __exp10l_finite(long double x)
{
long double res = exp10l(x);
ASSERT_FINITEL(res);
return res;
}
/**
* Returns the base-2 exponential function of x, which is 2 raised to the power x
*/
float __exp2f_finite(float x)
{
float res = exp2f(x);
ASSERT_FINITEF(res);
return res;
}
/**
* Returns the base-2 exponential function of x, which is 2 raised to the power x
*/
double __exp2_finite(double x)
{
double res = exp2(x);
ASSERT_FINITE(res);
return res;
}
/**
* Returns the base-2 exponential function of x, which is 2 raised to the power x
*/
long double __exp2l_finite(long double x)
{
long double res = exp2l(x);
ASSERT_FINITEL(res);
return res;
}
/**
* Returns the base-e exponential function of x, which is e raised to the power x
*/
float __expf_finite(float x)
{
float res = expf(x);
ASSERT_FINITEF(res);
return res;
}
/**
* Returns the base-e exponential function of x, which is e raised to the power x
*/
double __exp_finite(double x)
{
double res = exp(x);
ASSERT_FINITE(res);
return res;
}
/**
* Returns the base-e exponential function of x, which is e raised to the power x
*/
long double __expl_finite(long double x)
{
long double res = expl(x);
ASSERT_FINITEL(res);
return res;
}
/**
* Returns the floating-point remainder of x/y (rounded towards zero)
*/
float __fmodf_finite(float x, float y)
{
float res = fmodf(x, y);
ASSERT_FINITEF(res);
return res;
}
/**
* Returns the floating-point remainder of x/y (rounded towards zero)
*/
double __fmod_finite(double x, double y)
{
double res = fmod(x, y);
ASSERT_FINITE(res);
return res;
}
/**
* Returns the floating-point remainder of x/y (rounded towards zero)
*/
long double __fmodl_finite(long double x, long double y)
{
long double res = fmodl(x, y);
ASSERT_FINITEL(res);
return res;
}
/**
* Computes the square root of the sum of the squares of x and y, without undue
* overflow or underflow at intermediate stages of the computation.
*/
float __hypotf_finite(float x, float y)
{
float res = hypotf(x, y);
ASSERT_FINITEF(res);
return res;
}
/**
* Computes the square root of the sum of the squares of x and y, without undue
* overflow or underflow at intermediate stages of the computation.
*/
double __hypot_finite(double x, double y)
{
double res = hypot(x, y);
ASSERT_FINITE(res);
return res;
}
/**
* Computes the square root of the sum of the squares of x and y, without undue
* overflow or underflow at intermediate stages of the computation.
*/
long double __hypotl_finite(long double x, long double y)
{
long double res = hypotl(x, y);
ASSERT_FINITEL(res);
return res;
}
/**
* Return Bessel functions of x of the first kind of orders 0.
*/
float __j0f_finite(float x)
{
float res = j0f(x);
ASSERT_FINITEF(res);
return res;
}
/**
* Return Bessel functions of x of the first kind of orders 0.
*/
double __j0_finite(double x)
{
double res = j0(x);
ASSERT_FINITE(res);
return res;
}
/* The below requires support for j0l, see above */
#if 0
/**
* Return Bessel functions of x of the first kind of orders 0.
*/
long double __j0l_finite(long double x)
{
long double res = j0l(x);
ASSERT_FINITEL(res);
return res;
}
#endif
/**
* Return Bessel functions of x of the first kind of orders 1.
*/
float __j1f_finite(float x)
{
float res = j1f(x);
ASSERT_FINITEF(res);
return res;
}
/**
* Return Bessel functions of x of the first kind of orders 1.
*/
double __j1_finite(double x)
{
double res = j1(x);
ASSERT_FINITE(res);
return res;
}
/* The below requires support for j1l, see above */
#if 0
/**
* Return Bessel functions of x of the first kind of orders 1.
*/
long double __j1l_finite(long double x)
{
long double res = j1l(x);
ASSERT_FINITEL(res);
return res;
}
#endif
/**
* Return the Bessel function of x of the first kind of order n.
*/
float __jnf_finite(int n, float x)
{
float res = jnf(n, x);
ASSERT_FINITEF(res);
return res;
}
/**
* Return the Bessel function of x of the first kind of order n.
*/
double __jn_finite(int n, double x)
{
double res = jn(n, x);
ASSERT_FINITE(res);
return res;
}
/* The below requires support for jnl, see above */
#if 0
/**
* Return the Bessel function of x of the first kind of order n.
*/
long double __jnl_finite(int n, long double x)
{
long double res = jnl(n, x);
ASSERT_FINITEL(res);
return res;
}
#endif
/**
* Returns the natural logarithm of the absolute value of the Gamma function.
*/
float __lgammaf_finite(float x)
{
float res = lgammaf(x);
ASSERT_FINITEF(res);
return res;
}
alias(__lgammaf_finite, __gammaf_finite);
/**
* Returns the natural logarithm of the absolute value of the Gamma function.
*/
double __lgamma_finite(double x)
{
double res = lgamma(x);
ASSERT_FINITE(res);
return res;
}
alias(__lgamma_finite, __gamma_finite);
/**
* Returns the natural logarithm of the absolute value of the Gamma function.
*/
long double __lgammal_finite(long double x)
{
long double res = lgammal(x);
ASSERT_FINITEL(res);
return res;
}
alias(__lgammal_finite, __gammal_finite);
/**
* Returns the natural logarithm of the absolute value of the Gamma function.
*/
float __lgammaf_r_finite(float x, int *p)
{
float res = lgammaf_r(x, p);
ASSERT_FINITEF(res);
return res;
}
alias(__lgammaf_r_finite, __gammaf_r_finite);
/**
* Returns the natural logarithm of the absolute value of the Gamma function.
*/
double __lgamma_r_finite(double x, int *p)
{
double res = lgamma_r(x, p);
ASSERT_FINITE(res);
return res;
}
alias(__lgamma_r_finite, __gamma_r_finite);
/**
* Returns the natural logarithm of the absolute value of the Gamma function.
*/
long double __lgammal_r_finite(long double x, int *p)
{
long double res = lgammal_r(x, p);
ASSERT_FINITEL(res);
return res;
}
alias(__lgammal_r_finite, __gammal_r_finite);
/**
* Returns the common (base-10) logarithm of x.
*/
float __log10f_finite(float x)
{
float res = log10f(x);
ASSERT_FINITEF(res);
return res;
}
/**
* Returns the common (base-10) logarithm of x.
*/
double __log10_finite(double x)
{
double res = log10(x);
ASSERT_FINITE(res);
return res;
}
/**
* Returns the common (base-10) logarithm of x.
*/
long double __log10l_finite(long double x)
{
long double res = log10l(x);
ASSERT_FINITEL(res);
return res;
}
/**
* Returns the binary (base-2) logarithm of x.
*/
float __log2f_finite(float x)
{
float res = log2f(x);
ASSERT_FINITEF(res);
return res;
}
/**
* Returns the binary (base-2) logarithm of x.
*/
double __log2_finite(double x)
{
double res = log2(x);
ASSERT_FINITE(res);
return res;
}
/**
* Returns the binary (base-2) logarithm of x.
*/
long double __log2l_finite(long double x)
{
long double res = log2l(x);
ASSERT_FINITEL(res);
return res;
}
/**
* Returns the natural logarithm of x.
*/
float __logf_finite(float x)
{
float res = logf(x);
ASSERT_FINITEF(res);
return res;
}
/**
* Returns the natural logarithm of x.
*/
double __log_finite(double x)
{
double res = log(x);
ASSERT_FINITE(res);
return res;
}
/**
* Returns the natural logarithm of x.
*/
long double __logl_finite(long double x)
{
long double res = logl(x);
ASSERT_FINITEL(res);
return res;
}
/**
* Returns x raised to the y exponent.
*/
float __powf_finite(float x, float y)
{
float res = powf(x, y);
ASSERT_FINITEF(res);
return res;
}
/**
* Returns x raised to the y exponent.
*/
double __pow_finite(double x, double y)
{
double res = pow(x, y);
ASSERT_FINITE(res);
return res;
}
/**
* Returns x raised to the y exponent.
*/
long double __powl_finite(long double x, long double y)
{
long double res = powl(x, y);
ASSERT_FINITEL(res);
return res;
}
/**
* Returns the floating-point remainder of x/y (rounded to nearest).
*/
float __remainderf_finite(float x, float y)
{
float res = remainderf(x, y);
ASSERT_FINITEF(res);
return res;
}
/**
* Returns the floating-point remainder of x/y (rounded to nearest).
*/
double __remainder_finite(double x, double y)
{
double res = remainder(x, y);
ASSERT_FINITE(res);
return res;
}
/**
* Returns the floating-point remainder of x/y (rounded to nearest).
*/
long double __remainderl_finite(long double x, long double y)
{
long double res = remainderl(x, y);
ASSERT_FINITEL(res);
return res;
}
/**
* Multiplies the first argument x by FLT_RADIX (probably 2) to the power of y.
*/
float __scalbf_finite(float x, float y)
{
float res = scalbf(x, y);
ASSERT_FINITEF(res);
return res;
}
/**
* Multiplies the first argument x by FLT_RADIX (probably 2) to the power of y.
*/
double __scalb_finite(double x, double y)
{
double res = scalb(x, y);
ASSERT_FINITE(res);
return res;
}
/**
* Multiplies the first argument x by FLT_RADIX (probably 2) to the power of y.
*/
long double __scalbl_finite(long double x, long double y)
{
long double res = scalbl(x, y);
ASSERT_FINITEL(res);
return res;
}
/**
* Returns the hyperbolic sine of x.
*/
float __sinhf_finite(float x)
{
float res = sinhf(x);
ASSERT_FINITEF(res);
return res;
}
/**
* Returns the hyperbolic sine of x.
*/
double __sinh_finite(double x)
{
double res = sinh(x);
ASSERT_FINITE(res);
return res;
}
/**
* Returns the hyperbolic sine of x.
*/
long double __sinhl_finite(long double x)
{
long double res = sinhl(x);
ASSERT_FINITEL(res);
return res;
}
/**
* Returns the square root of x.
*/
float __sqrtf_finite(float x)
{
float res = sqrtf(x);
ASSERT_FINITEF(res);
return res;
}
/**
* Returns the square root of x.
*/
double __sqrt_finite(double x)
{
double res = sqrt(x);
ASSERT_FINITE(res);
return res;
}
/**
* Returns the square root of x.
*/
long double __sqrtl_finite(long double x)
{
long double res = sqrtl(x);
ASSERT_FINITEL(res);
return res;
}
/**
* Return Bessel functions of x of the second kind of order 0.
*/
float __y0f_finite(float x)
{
float res = y0f(x);
ASSERT_FINITEF(res);
return res;
}
/**
* Return Bessel functions of x of the second kind of order 0.
*/
double __y0_finite(double x)
{
double res = y0(x);
ASSERT_FINITE(res);
return res;
}
/* The below requires support for y0l, see above */
#if 0
/**
* Return Bessel functions of x of the second kind of order 0.
*/
long double __y0l_finite(long double x)
{
long double res = y0l(x);
ASSERT_FINITEL(res);
return res;
}
#endif
/**
* Return Bessel functions of x of the second kind of order 1.
*/
float __y1f_finite(float x)
{
float res = y1f(x);
ASSERT_FINITEF(res);
return res;
}
/**
* Return Bessel functions of x of the second kind of order 1.
*/
double __y1_finite(double x)
{
double res = y1(x);
ASSERT_FINITE(res);
return res;
}
/* The below requires support for y1l, see above */
#if 0
/**
* Return Bessel functions of x of the second kind of order 1.
*/
long double __y1l_finite(long double x)
{
long double res = y1l(x);
ASSERT_FINITEL(res);
return res;
}
#endif
/**
* Return Bessel functions of x of the second kind of order n.
*/
float __ynf_finite(int n, float x)
{
float res = ynf(n, x);
ASSERT_FINITEF(res);
return res;
}
/**
* Return Bessel functions of x of the second kind of order n.
*/
double __yn_finite(int n, double x)
{
double res = yn(n, x);
ASSERT_FINITE(res);
return res;
}
/* The below requires support for ynl, see above */
#if 0
/**
* Return Bessel functions of x of the second kind of order n.
*/
long double __ynl_finite(int n, long double x)
{
long double res = ynl(n, x);
ASSERT_FINITEL(res);
return res;
}
#endif