getopt: fix null pointer arithmetic ub
[musl] / src / math / sinhl.c
1 #include "libm.h"
2
3 #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
4 long double sinhl(long double x)
5 {
6         return sinh(x);
7 }
8 #elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
9 long double sinhl(long double x)
10 {
11         union ldshape u = {x};
12         unsigned ex = u.i.se & 0x7fff;
13         long double h, t, absx;
14
15         h = 0.5;
16         if (u.i.se & 0x8000)
17                 h = -h;
18         /* |x| */
19         u.i.se = ex;
20         absx = u.f;
21
22         /* |x| < log(LDBL_MAX) */
23         if (ex < 0x3fff+13 || (ex == 0x3fff+13 && u.i.m>>32 < 0xb17217f7)) {
24                 t = expm1l(absx);
25                 if (ex < 0x3fff) {
26                         if (ex < 0x3fff-32)
27                                 return x;
28                         return h*(2*t - t*t/(1+t));
29                 }
30                 return h*(t + t/(t+1));
31         }
32
33         /* |x| > log(LDBL_MAX) or nan */
34         t = expl(0.5*absx);
35         return h*t*t;
36 }
37 #elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
38 // TODO: broken implementation to make things compile
39 long double sinhl(long double x)
40 {
41         return sinh(x);
42 }
43 #endif