home *** CD-ROM | disk | FTP | other *** search
- /* asinh.c
- *
- * Inverse hyperbolic sine
- *
- *
- *
- * SYNOPSIS:
- *
- * double x, y, asinh();
- *
- * y = asinh( x );
- *
- *
- *
- * DESCRIPTION:
- *
- * Returns inverse hyperbolic sine of argument.
- *
- * If |x| < 0.5, the function is approximated by a rational
- * form x + x**3 P(x)/Q(x). Otherwise,
- *
- * asinh(x) = log( x + sqrt(1 + x*x) ).
- *
- *
- *
- * ACCURACY:
- *
- * Relative error:
- * arithmetic domain # trials peak rms
- * DEC 0,2 15000 4.7e-17 1.3e-17
- * IEEE -1,1 30000 3.7e-16 7.8e-17
- * IEEE 1,3 30000 2.5e-16 6.7e-17
- *
- */
-
- /* asinh.c */
-
- /*
- Cephes Math Library Release 2.1: December, 1988
- Copyright 1984, 1987, 1988 by Stephen L. Moshier
- Direct inquiries to 30 Frost Street, Cambridge, MA 02140
- */
-
-
- #include "mconf.h"
-
- #ifdef UNK
- static double P[] = {
- -4.33231683752342103572E-3,
- -5.91750212056387121207E-1,
- -4.37390226194356683570E0,
- -9.09030533308377316566E0,
- -5.56682227230859640450E0
- };
- static double Q[] = {
- /* 1.00000000000000000000E0,*/
- 1.28757002067426453537E1,
- 4.86042483805291788324E1,
- 6.95722521337257608734E1,
- 3.34009336338516356383E1
- };
- #endif
-
- #ifdef DEC
- static short P[] = {
- 0136215,0173033,0110410,0105475,
- 0140027,0076361,0020056,0164520,
- 0140613,0173401,0160136,0053142,
- 0141021,0070744,0000503,0176261,
- 0140662,0021550,0073106,0133351
- };
- static short Q[] = {
- /* 0040200,0000000,0000000,0000000,*/
- 0041116,0001336,0034120,0173054,
- 0041502,0065300,0013144,0021231,
- 0041613,0022376,0035516,0153063,
- 0041405,0115216,0054265,0004557
- };
- #endif
-
- #ifdef IBMPC
- static short P[] = {
- 0x1168,0x7221,0xbec3,0xbf71,
- 0xdd2a,0x2405,0xef9e,0xbfe2,
- 0xcacc,0x3c0b,0x7ee0,0xc011,
- 0x7f96,0x8028,0x2e3c,0xc022,
- 0xd6dd,0x0ec8,0x446d,0xc016
- };
- static short Q[] = {
- /* 0x0000,0x0000,0x0000,0x3ff0,*/
- 0x1ec5,0xc70a,0xc05b,0x4029,
- 0x8453,0x02cc,0x4d58,0x4048,
- 0xdac6,0xc769,0x649f,0x4051,
- 0xa12e,0xcb16,0xb351,0x4040
- };
- #endif
-
- #ifdef MIEEE
- static short P[] = {
- 0xbf71,0xbec3,0x7221,0x1168,
- 0xbfe2,0xef9e,0x2405,0xdd2a,
- 0xc011,0x7ee0,0x3c0b,0xcacc,
- 0xc022,0x2e3c,0x8028,0x7f96,
- 0xc016,0x446d,0x0ec8,0xd6dd
- };
- static short Q[] = {
- 0x4029,0xc05b,0xc70a,0x1ec5,
- 0x4048,0x4d58,0x02cc,0x8453,
- 0x4051,0x649f,0xc769,0xdac6,
- 0x4040,0xb351,0xcb16,0xa12e
- };
- #endif
-
- extern double LOGE2;
-
- double asinh(x)
- double x;
- {
- double a, z;
- int sign;
- double log(), sqrt(), polevl(), p1evl();
-
- if( x < 0.0 )
- {
- sign = -1;
- x = -x;
- }
- else
- sign = 1;
-
- if( x > 1.0e8 )
- return( sign * (log(x) + LOGE2) );
-
- z = x * x;
- if( x < 0.5 )
- {
- a = ( polevl(z, P, 4)/p1evl(z, Q, 4) ) * z;
- a = a * x + x;
- if( sign < 0 )
- a = -a;
- return(a);
- }
-
- a = sqrt( z + 1.0 );
- return( sign * log(x + a) );
- }
-