#include <float.h>
#ifdef __i386__
#include <ieeefp.h>
#endif
#include "fpmath.h"
#include "math.h"
#include "math_private.h"
#include "k_expl.h"
#if LDBL_MAX_EXP != 0x4000
#error "Unsupported long double format"
#endif
#define BIAS (LDBL_MAX_EXP - 1)
static const long double shuge = 0x1p16383L;
#if LDBL_MANT_DIG == 64
static const union IEEEl2bits
S3u = LD80C(0xaaaaaaaaaaaaaaaa, -3, 1.66666666666666666658e-1L);
#define S3 S3u.e
static const double
S5 = 8.3333333333333332e-3,
S7 = 1.9841269841270074e-4,
S9 = 2.7557319223873889e-6,
S11 = 2.5052108406704084e-8,
S13 = 1.6059042748655297e-10,
S15 = 7.6470006914396920e-13,
S17 = 2.8346142308424267e-15;
#elif LDBL_MANT_DIG == 113
static const long double
S3 = 1.66666666666666666666666666666666033e-1L,
S5 = 8.33333333333333333333333333337643193e-3L,
S7 = 1.98412698412698412698412697391263199e-4L,
S9 = 2.75573192239858906525574406205464218e-6L,
S11 = 2.50521083854417187749675637460977997e-8L,
S13 = 1.60590438368216146368737762431552702e-10L,
S15 = 7.64716373181980539786802470969096440e-13L,
S17 = 2.81145725434775409870584280722701574e-15L;
static const double
S19= 8.2206352435411005e-18,
S21= 1.9572943931418891e-20,
S23 = 3.8679983530666939e-23,
S25 = 6.5067867911512749e-26;
#else
#error "Unsupported long double format"
#endif
static const float
o_threshold = 1.13572168e4;
long double
sinhl(long double x)
{
long double hi,lo,x2,x4;
#if LDBL_MANT_DIG == 113
double dx2;
#endif
double s;
int16_t ix,jx;
GET_LDBL_EXPSIGN(jx,x);
ix = jx&0x7fff;
if(ix>=0x7fff) return x+x;
ENTERI();
s = 1;
if (jx<0) s = -1;
if (ix<0x4005) {
if (ix<BIAS-(LDBL_MANT_DIG+1)/2)
if(shuge+x>1) RETURNI(x);
if (ix<0x3fff) {
x2 = x*x;
#if LDBL_MANT_DIG == 64
x4 = x2*x2;
RETURNI(((S17*x2 + S15)*x4 + (S13*x2 + S11))*(x2*x*x4*x4) +
((S9*x2 + S7)*x2 + S5)*(x2*x*x2) + S3*(x2*x) + x);
#elif LDBL_MANT_DIG == 113
dx2 = x2;
RETURNI(((((((((((S25*dx2 + S23)*dx2 +
S21)*x2 + S19)*x2 +
S17)*x2 + S15)*x2 + S13)*x2 + S11)*x2 + S9)*x2 + S7)*x2 +
S5)* (x2*x*x2) +
S3*(x2*x) + x);
#endif
}
k_hexpl(fabsl(x), &hi, &lo);
RETURNI(s*(lo - 0.25/(hi + lo) + hi));
}
if (fabsl(x) <= o_threshold)
RETURNI(s*hexpl(fabsl(x)));
return x*shuge;
}