2021-10-11 18:20:23 -03:00

46 lines
1.0 KiB
C

#ifndef lint
static char sccsid[] = "@(#)sinh.c 1.1 92/07/30 SMI";
#endif
/*
* Copyright (c) 1986 by Sun Microsystems, Inc.
*/
/* sinh(x)
* Code originated from 4.3bsd.
* Modified by K.C. Ng for SUN 4.0 libm.
* Method :
* 1. reduce x to non-negative by sinh(-x) = - sinh(x).
* 2.
*
* expm1(x) + expm1(x)/(expm1(x)+1)
* 0 <= x <= lnovft : sinh(x) := --------------------------------
* 2
* lnovft <= x < INF : sinh(x) := exp(x-1024*ln2)*2**1023
*
*
* Special cases:
* sinh(x) is x if x is +INF, -INF, or NaN.
* only sinh(0)=0 is exact for finite argument.
*
*/
#include <math.h>
#include "libm.h"
double sinh(x)
double x;
{
double r,t;
if(!finite(x)) return x+x; /* sinh of NaN or +-INF is itself */
r=fabs(x);
if(r<lnovft) {t=expm1(r); r = copysign((t+t/(1.0+t))*0.5,x);}
else {
if (r<1000.0) x = copysign(exp((r-1024*ln2hi)-1024*ln2lo),x);
r = scalbn(x,1023);
}
if (!finite(r)) r = SVID_libm_err(x,x,25);
return r;
}