| /* 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 |