[BACK]Return to s_asinh.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / lib / libm / src

Annotation of src/lib/libm/src/s_asinh.c, Revision 1.1.1.1

1.1       jtc         1:
                      2: /* @(#)s_asinh.c 5.1 93/09/24 */
                      3: /*
                      4:  * ====================================================
                      5:  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
                      6:  *
                      7:  * Developed at SunPro, a Sun Microsystems, Inc. business.
                      8:  * Permission to use, copy, modify, and distribute this
                      9:  * software is freely granted, provided that this notice
                     10:  * is preserved.
                     11:  * ====================================================
                     12:  */
                     13:
                     14: /* asinh(x)
                     15:  * Method :
                     16:  *     Based on
                     17:  *             asinh(x) = sign(x) * log [ |x| + sqrt(x*x+1) ]
                     18:  *     we have
                     19:  *     asinh(x) := x  if  1+x*x=1,
                     20:  *              := sign(x)*(log(x)+ln2)) for large |x|, else
                     21:  *              := sign(x)*log(2|x|+1/(|x|+sqrt(x*x+1))) if|x|>2, else
                     22:  *              := sign(x)*log1p(|x| + x^2/(1 + sqrt(1+x^2)))
                     23:  */
                     24:
                     25: #include "fdlibm.h"
                     26:
                     27: #ifdef __STDC__
                     28: static const double
                     29: #else
                     30: static double
                     31: #endif
                     32: one =  1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
                     33: ln2 =  6.93147180559945286227e-01, /* 0x3FE62E42, 0xFEFA39EF */
                     34: huge=  1.00000000000000000000e+300;
                     35:
                     36: #ifdef __STDC__
                     37:        double asinh(double x)
                     38: #else
                     39:        double asinh(x)
                     40:        double x;
                     41: #endif
                     42: {
                     43:        double t,w;
                     44:        int n0,hx,ix;
                     45:        n0 = ((*(int*)&one)>>29)^1;
                     46:        hx = *(n0+(int*)&x);
                     47:        ix = hx&0x7fffffff;
                     48:        if(ix>=0x7ff00000) return x+x;  /* x is inf or NaN */
                     49:        if(ix< 0x3e300000) {    /* |x|<2**-28 */
                     50:            if(huge+x>one) return x;    /* return x inexact except 0 */
                     51:        }
                     52:        if(ix>0x41b00000) {     /* |x| > 2**28 */
                     53:            w = __ieee754_log(fabs(x))+ln2;
                     54:        } else if (ix>0x40000000) {     /* 2**28 > |x| > 2.0 */
                     55:            t = fabs(x);
                     56:            w = __ieee754_log(2.0*t+one/(sqrt(x*x+one)+t));
                     57:        } else {                /* 2.0 > |x| > 2**-28 */
                     58:            t = x*x;
                     59:            w =log1p(fabs(x)+t/(one+sqrt(one+t)));
                     60:        }
                     61:        if(hx>0) return w; else return -w;
                     62: }

CVSweb <webmaster@jp.NetBSD.org>