#include "math.h"
#include "math_private.h"
float sinhf( float x )
{
static const float overflow = 88;
float fabsx = __builtin_fabsf( x );
if( x != x ) return x + x;
if( fabsx == __builtin_inff() ) return x;
if( fabsx > 0x1.0p-12 ) {
if( fabsx < overflow )
{
fabsx = expm1f( fabsx );
fabsx = 0.5f * ( fabsx + fabsx / (1.0f + fabsx ) );
}
else
{
fabsx = expf( 0.5f * fabsx );
fabsx = ( 0.5f * fabsx ) * fabsx;
}
}
else
{
if( x == 0.0f )
return x;
fabsx *= 0x1.0p25f;
fabsx += 0x1.0p-126f;
fabsx *= 0x1.0p-25f;
}
if( x < 0.0f )
fabsx = -fabsx;
return fabsx;
}
double sinh( double x )
{
static const double overflow = 709;
double fabsx = __builtin_fabs( x );
if( x != x ) return x + x;
if( fabsx == __builtin_inf() ) return x;
if( fabsx > 0x1.0p-27 ) {
if( fabsx < overflow )
{
fabsx = expm1( fabsx );
fabsx = 0.5 * ( fabsx + fabsx / (1.0 + fabsx ) );
}
else
{
fabsx = exp( 0.5 * fabsx );
fabsx = ( 0.5 * fabsx ) * fabsx;
}
}
else
{
if( x == 0.0 )
return x;
fabsx *= 0x1.0p55;
fabsx += 0x1.0p-1022;
fabsx *= 0x1.0p-55;
}
if( x < 0.0 )
fabsx = -fabsx;
return fabsx;
}
long double sinhl( long double x )
{
static const long double overflow = 11356;
long double fabsx = __builtin_fabsl( x );
if( x != x ) return x + x;
if( fabsx == __builtin_infl() ) return x;
if( fabsx > 0x1.0p-32 ) {
if( fabsx < overflow )
{
fabsx = expm1l( fabsx );
fabsx = 0.5L * ( fabsx + fabsx / (1.0L + fabsx ) );
}
else
{
fabsx = expl( 0.5L * fabsx );
fabsx = ( 0.5L * fabsx ) * fabsx;
}
}
else
{
if( x == 0.0L )
return x;
fabsx *= 0x1.0p67;
fabsx += 0x1.0p-16382L;
fabsx *= 0x1.0p-67;
}
if( x < 0.0 )
fabsx = -fabsx;
return fabsx;
}