1 /* sf_sin.c -- float version of s_sin.c.
2 * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
3 */
4
5 /*
6 * ====================================================
7 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
8 *
9 * Developed at SunPro, a Sun Microsystems, Inc. business.
10 * Permission to use, copy, modify, and distribute this
11 * software is freely granted, provided that this notice
12 * is preserved.
13 * ====================================================
14 */
15
16 #include "fdlibm.h"
17 #if __OBSOLETE_MATH_FLOAT
18
19 float
sinf(float x)20 sinf(float x)
21 {
22 float y[2], z = 0.0;
23 __int32_t n, ix;
24
25 GET_FLOAT_WORD(ix, x);
26
27 /* |x| ~< pi/4 */
28 ix &= 0x7fffffff;
29 if (ix <= 0x3f490fd8)
30 return __kernel_sinf(x, z, 0);
31
32 /* sin(Inf or NaN) is NaN */
33 else if (!FLT_UWORD_IS_FINITE(ix))
34 return __math_invalidf(x);
35
36 /* argument reduction needed */
37 else {
38 n = __rem_pio2f(x, y);
39 switch (n & 3) {
40 case 0:
41 return __kernel_sinf(y[0], y[1], 1);
42 case 1:
43 return __kernel_cosf(y[0], y[1]);
44 case 2:
45 return -__kernel_sinf(y[0], y[1], 1);
46 default:
47 return -__kernel_cosf(y[0], y[1]);
48 }
49 }
50 }
51
52 #if defined(_HAVE_ALIAS_ATTRIBUTE)
53 #ifndef __clang__
54 #pragma GCC diagnostic ignored "-Wmissing-attributes"
55 #endif
56 __strong_reference(sinf, _sinf);
57 #endif
58
59 _MATH_ALIAS_f_f(sin)
60
61 #else
62 #include "../common/sinf.c"
63 #endif /* __OBSOLETE_MATH_FLOAT */
64