


/*




* This file is part of the MicroPython project, http://micropython.org/




*




* These math functions are taken from newlibnano2, the newlib/libm/math




* directory, available from https://github.com/32bitmicro/newlibnano2.




*




* Appropriate copyright headers are reproduced below.




*/








/* sf_sin.c  float version of s_sin.c.




* Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.




*/








/*




* ====================================================




* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.




*




* Developed at SunPro, a Sun Microsystems, Inc. business.




* Permission to use, copy, modify, and distribute this




* software is freely granted, provided that this notice




* is preserved.




* ====================================================




*/








#include "fdlibm.h"








#ifdef __STDC__




float sinf(float x)




#else




float sinf(x)




float x;




#endif




{




float y[2],z=0.0;




__int32_t n,ix;








GET_FLOAT_WORD(ix,x);








/* x ~< pi/4 */




ix &= 0x7fffffff;




if(ix <= 0x3f490fd8) return __kernel_sinf(x,z,0);








/* sin(Inf or NaN) is NaN */




else if (!FLT_UWORD_IS_FINITE(ix)) return xx;








/* argument reduction needed */




else {




n = __ieee754_rem_pio2f(x,y);




switch(n&3) {




case 0: return __kernel_sinf(y[0],y[1],1);




case 1: return __kernel_cosf(y[0],y[1]);




case 2: return __kernel_sinf(y[0],y[1],1);




default:




return __kernel_cosf(y[0],y[1]);




}




}




}








#ifdef _DOUBLE_IS_32BITS








#ifdef __STDC__




double sin(double x)




#else




double sin(x)




double x;




#endif




{




return (double) sinf((float) x);




}








#endif /* defined(_DOUBLE_IS_32BITS) */
