math: fix __fpclassifyl(-0.0) for IEEE binary128
[oweals/musl.git] / src / math / cosl.c
1 #include "libm.h"
2
3 #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
4 long double cosl(long double x) {
5         return cos(x);
6 }
7 #elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
8 long double cosl(long double x)
9 {
10         union ldshape u = {x};
11         unsigned n;
12         long double y[2], hi, lo;
13
14         u.i.se &= 0x7fff;
15         if (u.i.se == 0x7fff)
16                 return x - x;
17         x = u.f;
18         if (x < M_PI_4) {
19                 if (u.i.se < 0x3fff - LDBL_MANT_DIG)
20                         /* raise inexact if x!=0 */
21                         return 1.0 + x;
22                 return __cosl(x, 0);
23         }
24         n = __rem_pio2l(x, y);
25         hi = y[0];
26         lo = y[1];
27         switch (n & 3) {
28         case 0:
29                 return __cosl(hi, lo);
30         case 1:
31                 return -__sinl(hi, lo, 1);
32         case 2:
33                 return -__cosl(hi, lo);
34         case 3:
35         default:
36                 return __sinl(hi, lo, 1);
37         }
38 }
39 #endif