mirror of
https://git.busybox.net/uClibc
synced 2025-10-14 01:32:00 +08:00
425 lines
6.5 KiB
C
425 lines
6.5 KiB
C
/* vi: set sw=4 ts=4: */
|
|
/*
|
|
* Wrapper functions implementing all the float math functions
|
|
* defined by SuSv3 by actually calling the double version of
|
|
* each function and then casting the result back to a float
|
|
* to return to the user.
|
|
*
|
|
* Copyright (C) 2005 by Erik Andersen <andersen@uclibc.org>
|
|
*
|
|
* GNU Lesser General Public License version 2.1 or later.
|
|
*/
|
|
|
|
#include <features.h>
|
|
/* Prevent math.h from defining colliding inlines */
|
|
#undef __USE_EXTERN_INLINES
|
|
#include <math.h>
|
|
#include <complex.h>
|
|
|
|
|
|
#define WRAPPER1(func) \
|
|
float func##f (float x) \
|
|
{ \
|
|
return (float) func((double)x); \
|
|
}
|
|
#define int_WRAPPER1(func) \
|
|
int func##f (float x) \
|
|
{ \
|
|
return func((double)x); \
|
|
}
|
|
#define long_WRAPPER1(func) \
|
|
long func##f (float x) \
|
|
{ \
|
|
return func((double)x); \
|
|
}
|
|
#define long_long_WRAPPER1(func) \
|
|
long long func##f (float x) \
|
|
{ \
|
|
return func((double)x); \
|
|
}
|
|
|
|
#ifndef __DO_XSI_MATH__
|
|
# undef L_j0f /* float j0f(float x); */
|
|
# undef L_j1f /* float j1f(float x); */
|
|
# undef L_jnf /* float jnf(int n, float x); */
|
|
# undef L_y0f /* float y0f(float x); */
|
|
# undef L_y1f /* float y1f(float x); */
|
|
# undef L_ynf /* float ynf(int n, float x); */
|
|
#endif
|
|
|
|
/* Implement the following, as defined by SuSv3 */
|
|
#if 0
|
|
float acosf(float);
|
|
float acoshf(float);
|
|
float asinf(float);
|
|
float asinhf(float);
|
|
float atan2f(float, float);
|
|
float atanf(float);
|
|
float atanhf(float);
|
|
float cargf(float complex);
|
|
float cbrtf(float);
|
|
float ceilf(float);
|
|
float copysignf(float, float);
|
|
float cosf(float);
|
|
float coshf(float);
|
|
float erfcf(float);
|
|
float erff(float);
|
|
float exp2f(float);
|
|
float expf(float);
|
|
float expm1f(float);
|
|
float fabsf(float);
|
|
float floorf(float);
|
|
float fmodf(float, float);
|
|
float frexpf(float value, int *);
|
|
float hypotf(float, float);
|
|
int ilogbf(float);
|
|
float ldexpf(float, int);
|
|
float lgammaf(float);
|
|
long long llroundf(float);
|
|
float log10f(float);
|
|
float log1pf(float);
|
|
float log2f(float);
|
|
float logbf(float);
|
|
float logf(float);
|
|
long lroundf(float);
|
|
float modff(float, float *);
|
|
float powf(float, float);
|
|
float remainderf(float, float);
|
|
float rintf(float);
|
|
float roundf(float);
|
|
float scalbnf(float, int);
|
|
float sinf(float);
|
|
float sinhf(float);
|
|
float sqrtf(float);
|
|
float tanf(float);
|
|
float tanhf(float);
|
|
#endif
|
|
|
|
#ifdef L_acosf
|
|
WRAPPER1(acos)
|
|
#endif
|
|
|
|
#ifdef L_acoshf
|
|
WRAPPER1(acosh)
|
|
#endif
|
|
|
|
#ifdef L_asinf
|
|
WRAPPER1(asin)
|
|
#endif
|
|
|
|
#ifdef L_asinhf
|
|
WRAPPER1(asinh)
|
|
#endif
|
|
|
|
#ifdef L_atan2f
|
|
float atan2f (float x, float y)
|
|
{
|
|
return (float) atan2( (double)x, (double)y );
|
|
}
|
|
#endif
|
|
|
|
#ifdef L_atanf
|
|
WRAPPER1(atan)
|
|
#endif
|
|
|
|
#ifdef L_atanhf
|
|
WRAPPER1(atanh)
|
|
#endif
|
|
|
|
#ifdef L_cargf
|
|
float cargf (float complex x)
|
|
{
|
|
return (float) carg( (double complex)x );
|
|
}
|
|
#endif
|
|
|
|
#ifdef L_cbrtf
|
|
WRAPPER1(cbrt)
|
|
#endif
|
|
|
|
#ifdef L_ceilf
|
|
WRAPPER1(ceil)
|
|
#endif
|
|
|
|
#ifdef L_copysignf
|
|
float copysignf (float x, float y)
|
|
{
|
|
return (float) copysign( (double)x, (double)y );
|
|
}
|
|
#endif
|
|
|
|
#ifdef L_cosf
|
|
WRAPPER1(cos)
|
|
libm_hidden_def(cosf)
|
|
#endif
|
|
|
|
#ifdef L_coshf
|
|
WRAPPER1(cosh)
|
|
#endif
|
|
|
|
#ifdef L_erfcf
|
|
WRAPPER1(erfc)
|
|
#endif
|
|
|
|
#ifdef L_erff
|
|
WRAPPER1(erf)
|
|
#endif
|
|
|
|
#ifdef L_exp2f
|
|
WRAPPER1(exp2)
|
|
#endif
|
|
|
|
#ifdef L_expf
|
|
WRAPPER1(exp)
|
|
#endif
|
|
|
|
#ifdef L_expm1f
|
|
WRAPPER1(expm1)
|
|
#endif
|
|
|
|
#ifdef L_fabsf
|
|
WRAPPER1(fabs)
|
|
#endif
|
|
|
|
#ifdef L_fdimf
|
|
float fdimf (float x, float y)
|
|
{
|
|
return (float) fdim( (double)x, (double)y );
|
|
}
|
|
#endif
|
|
|
|
#ifdef L_floorf
|
|
WRAPPER1(floor)
|
|
#endif
|
|
|
|
#ifdef L_fmaf
|
|
float fmaf (float x, float y, float z)
|
|
{
|
|
return (float) fma( (double)x, (double)y, (double)z );
|
|
}
|
|
#endif
|
|
|
|
#ifdef L_fmaxf
|
|
float fmaxf (float x, float y)
|
|
{
|
|
return (float) fmax( (double)x, (double)y );
|
|
}
|
|
#endif
|
|
|
|
#ifdef L_fminf
|
|
float fminf (float x, float y)
|
|
{
|
|
return (float) fmin( (double)x, (double)y );
|
|
}
|
|
#endif
|
|
|
|
#ifdef L_fmodf
|
|
float fmodf (float x, float y)
|
|
{
|
|
return (float) fmod( (double)x, (double)y );
|
|
}
|
|
#endif
|
|
|
|
#ifdef L_frexpf
|
|
float frexpf (float x, int *_exp)
|
|
{
|
|
return (float) frexp( (double)x, _exp );
|
|
}
|
|
#endif
|
|
|
|
#ifdef L_hypotf
|
|
float hypotf (float x, float y)
|
|
{
|
|
return (float) hypot( (double)x, (double)y );
|
|
}
|
|
#endif
|
|
|
|
#ifdef L_ilogbf
|
|
int_WRAPPER1(ilogb)
|
|
#endif
|
|
|
|
#ifdef L_j0f
|
|
WRAPPER1(j0)
|
|
#endif
|
|
|
|
#ifdef L_j1f
|
|
WRAPPER1(j1)
|
|
#endif
|
|
|
|
#ifdef L_jnf
|
|
float jnf(int n, float x)
|
|
{
|
|
return (float) jn(n, (double)x);
|
|
}
|
|
#endif
|
|
|
|
#ifdef L_ldexpf
|
|
float ldexpf (float x, int _exp)
|
|
{
|
|
return (float) ldexp( (double)x, _exp );
|
|
}
|
|
#endif
|
|
|
|
#ifdef L_lgammaf
|
|
WRAPPER1(lgamma)
|
|
#endif
|
|
|
|
#ifdef L_llrintf
|
|
long_long_WRAPPER1(llrint)
|
|
#endif
|
|
|
|
#ifdef L_llroundf
|
|
long_long_WRAPPER1(llround)
|
|
#endif
|
|
|
|
#ifdef L_log10f
|
|
WRAPPER1(log10)
|
|
#endif
|
|
|
|
#ifdef L_log1pf
|
|
WRAPPER1(log1p)
|
|
#endif
|
|
|
|
#ifdef L_log2f
|
|
WRAPPER1(log2)
|
|
#endif
|
|
|
|
#ifdef L_logbf
|
|
WRAPPER1(logb)
|
|
#endif
|
|
|
|
#ifdef L_logf
|
|
WRAPPER1(log)
|
|
#endif
|
|
|
|
#ifdef L_lrintf
|
|
long_WRAPPER1(lrint)
|
|
#endif
|
|
|
|
#ifdef L_lroundf
|
|
long_WRAPPER1(lround)
|
|
#endif
|
|
|
|
#ifdef L_modff
|
|
float modff (float x, float *iptr)
|
|
{
|
|
double y, result;
|
|
result = modf( x, &y );
|
|
*iptr = (float)y;
|
|
return (float) result;
|
|
}
|
|
#endif
|
|
|
|
#ifdef L_nearbyintf
|
|
WRAPPER1(nearbyint)
|
|
#endif
|
|
|
|
#ifdef L_nexttowardf
|
|
float nexttowardf (float x, long double y)
|
|
{
|
|
return (float) nexttoward( (double)x, (long double)y );
|
|
}
|
|
#endif
|
|
|
|
#ifdef L_powf
|
|
float powf (float x, float y)
|
|
{
|
|
return (float) pow( (double)x, (double)y );
|
|
}
|
|
#endif
|
|
|
|
#ifdef L_remainderf
|
|
float remainderf (float x, float y)
|
|
{
|
|
return (float) remainder( (double)x, (double)y );
|
|
}
|
|
#endif
|
|
|
|
#ifdef L_remquof
|
|
float remquof (float x, float y, int *quo)
|
|
{
|
|
return (float) remquo( (double)x, (double)y, quo );
|
|
}
|
|
#endif
|
|
|
|
#ifdef L_rintf
|
|
WRAPPER1(rint)
|
|
#endif
|
|
|
|
#ifdef L_roundf
|
|
WRAPPER1(round)
|
|
#endif
|
|
|
|
#ifdef L_scalblnf
|
|
float scalblnf (float x, long _exp)
|
|
{
|
|
return (float) scalbln( (double)x, _exp );
|
|
}
|
|
#endif
|
|
|
|
#ifdef L_scalbnf
|
|
float scalbnf (float x, int _exp)
|
|
{
|
|
return (float) scalbn( (double)x, _exp );
|
|
}
|
|
#endif
|
|
|
|
#ifdef L_sinf
|
|
WRAPPER1(sin)
|
|
libm_hidden_def(sinf)
|
|
#endif
|
|
|
|
#ifdef L_sinhf
|
|
WRAPPER1(sinh)
|
|
#endif
|
|
|
|
#ifdef L_sqrtf
|
|
WRAPPER1(sqrt)
|
|
#endif
|
|
|
|
#ifdef L_tanf
|
|
WRAPPER1(tan)
|
|
#endif
|
|
|
|
#ifdef L_tanhf
|
|
WRAPPER1(tanh)
|
|
#endif
|
|
|
|
#ifdef L_tgammaf
|
|
WRAPPER1(tgamma)
|
|
#endif
|
|
|
|
#ifdef L_truncf
|
|
WRAPPER1(trunc)
|
|
#endif
|
|
|
|
#if defined L_scalbf && defined __UCLIBC_SUSV3_LEGACY__
|
|
float scalbf (float x, float y)
|
|
{
|
|
return (float) scalb( (double)x, (double)y );
|
|
}
|
|
#endif
|
|
|
|
#ifdef L_gammaf
|
|
WRAPPER1(gamma)
|
|
#endif
|
|
|
|
#ifdef L_significandf
|
|
WRAPPER1(significand)
|
|
#endif
|
|
|
|
#ifdef L_y0f
|
|
WRAPPER1(y0)
|
|
#endif
|
|
|
|
#ifdef L_y1f
|
|
WRAPPER1(y1)
|
|
#endif
|
|
|
|
#ifdef L_ynf
|
|
float ynf(int n, float x)
|
|
{
|
|
return (float) yn(n, (double)x);
|
|
}
|
|
#endif
|