/* sinh.c
*
* Hyperbolic sine
*
*
*
* SYNOPSIS :
*
* double x , y , sinh ( ) ;
*
* y = sinh ( x ) ;
*
*
*
* DESCRIPTION :
*
* Returns hyperbolic sine of argument in the range MINLOG to
* MAXLOG .
*
* The range is partitioned into two segments . If | x | < = 1 , a
* rational function of the form x + x * * 3 P ( x ) / Q ( x ) is employed .
* Otherwise the calculation is sinh ( x ) = ( exp ( x ) - exp ( - x ) ) / 2 .
*
*
*
* ACCURACY :
*
* Relative error :
* arithmetic domain # trials peak rms
* DEC + - 88 50000 4 . 0 e - 17 7 . 7 e - 18
* IEEE + - MAXLOG 30000 2 . 6 e - 16 5 . 7 e - 17
*
*/
/*
Cephes Math Library Release 2 . 8 : June , 2000
Copyright 1984 , 1995 , 2000 by Stephen L . Moshier
*/
#include "mconf.h"
#ifdef UNK
static double P[] = {-7 .89474443963537015605 E-1 , -1 .63725857525983828727 E2,
-1 .15614435765005216044 E4, -3 .51754964808151394800 E5};
static double Q[] = {
/* 1.00000000000000000000E0,*/
-2 .77711081420602794433 E2, 3 .61578279834431989373 E4,
-2 .11052978884890840399 E6};
#endif
#ifdef DEC
static unsigned short P[] = {
0140112 , 0015377 , 0042731 , 0163255 , 0142043 , 0134721 , 0146177 , 0123761 ,
0143464 , 0122706 , 0034353 , 0006017 , 0144653 , 0140536 , 0157665 , 0054045 };
static unsigned short Q[] = {
/*0040200,0000000,0000000,0000000,*/
0142212 , 0155404 , 0133513 , 0022040 , 0044015 , 0036723 ,
0173271 , 0011053 , 0145400 , 0150407 , 0023710 , 0001034 };
#endif
#ifdef IBMPC
static unsigned short P[] = {0 x3cd6, 0 xe8bb, 0 x435f, 0 xbfe9, 0 xf4fe, 0 x398f,
0 x773a, 0 xc064, 0 x6182, 0 xc71d, 0 x94b8, 0 xc0c6,
0 xab05, 0 xdbf6, 0 x782b, 0 xc115};
static unsigned short Q[] = {
/*0x0000,0x0000,0x0000,0x3ff0,*/
0 x6484, 0 x96e9, 0 x5b60, 0 xc071, 0 x2245, 0 x7ed7,
0 xa7ba, 0 x40e1, 0 x0044, 0 xe4f9, 0 x1a20, 0 xc140};
#endif
#ifdef MIEEE
static unsigned short P[] = {0 xbfe9, 0 x435f, 0 xe8bb, 0 x3cd6, 0 xc064, 0 x773a,
0 x398f, 0 xf4fe, 0 xc0c6, 0 x94b8, 0 xc71d, 0 x6182,
0 xc115, 0 x782b, 0 xdbf6, 0 xab05};
static unsigned short Q[] = {0 xc071, 0 x5b60, 0 x96e9, 0 x6484, 0 x40e1, 0 xa7ba,
0 x7ed7, 0 x2245, 0 xc140, 0 x1a20, 0 xe4f9, 0 x0044};
#endif
#ifdef ANSIPROT
extern double fabs(double );
extern double exp(double );
extern double polevl(double , void *, int );
extern double p1evl(double , void *, int );
#else
double fabs(), exp(), polevl(), p1evl();
#endif
extern double INFINITY, MINLOG, MAXLOG, LOGE2;
double sinh(x) double x;
{
double a;
#ifdef MINUSZERO
if (x == 0 .0 )
return (x);
#endif
a = fabs(x);
if ((x > (MAXLOG + LOGE2)) || (x > -(MINLOG - LOGE2))) {
mtherr("sinh" , DOMAIN);
if (x > 0 )
return (INFINITY);
else
return (-INFINITY);
}
if (a > 1 .0 ) {
if (a >= (MAXLOG - LOGE2)) {
a = exp(0 .5 * a);
a = (0 .5 * a) * a;
if (x < 0 )
a = -a;
return (a);
}
a = exp(a);
a = 0 .5 * a - (0 .5 / a);
if (x < 0 )
a = -a;
return (a);
}
a *= a;
return (x + x * a * (polevl(a, P, 3 ) / p1evl(a, Q, 3 )));
}
Messung V0.5 in Prozent C=96 H=94 G=94
¤ Dauer der Verarbeitung: 0.5 Sekunden
¤
*© Formatika GbR, Deutschland