/* 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); \ } /* For the time being, do _NOT_ implement these functions * that are defined by SuSv3 [because we don't need them * and nobody asked to include them] */ #undef L_fdimf /*float fdimf(float, float);*/ #undef L_fmaf /*float fmaf(float, float, float);*/ #undef L_fmaxf /*float fmaxf(float, float);*/ #undef L_fminf /*float fminf(float, float);*/ #undef L_nearbyintf /*float nearbyintf(float);*/ #undef L_nexttowardf /*float nexttowardf(float, long double);*/ #undef L_remquof /*float remquof(float, float, int *);*/ #undef L_scalblnf /*float scalblnf(float, long);*/ #undef L_tgammaf /*float tgammaf(float);*/ /* 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) #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_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, (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) #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 #ifdef L_fmaf float fmaf (float x, float y, float z) { return (float) fma( (double)x, (double)y, (double)z ); } #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