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

Annotation of src/lib/libm/src/e_acosh.c, Revision 1.9

1.1       jtc         1: /* @(#)e_acosh.c 5.1 93/09/24 */
                      2: /*
                      3:  * ====================================================
                      4:  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
                      5:  *
                      6:  * Developed at SunPro, a Sun Microsystems, Inc. business.
                      7:  * Permission to use, copy, modify, and distribute this
                      8:  * software is freely granted, provided that this notice
                      9:  * is preserved.
                     10:  * ====================================================
                     11:  */
1.3       jtc        12:
1.7       jtc        13: #if defined(LIBM_SCCS) && !defined(lint)
1.9     ! jtc        14: static char rcsid[] = "$NetBSD: e_acosh.c,v 1.8 1995/05/10 20:44:43 jtc Exp $";
1.3       jtc        15: #endif
1.1       jtc        16:
                     17: /* __ieee754_acosh(x)
                     18:  * Method :
                     19:  *     Based on
                     20:  *             acosh(x) = log [ x + sqrt(x*x-1) ]
                     21:  *     we have
                     22:  *             acosh(x) := log(x)+ln2, if x is large; else
                     23:  *             acosh(x) := log(2x-1/(sqrt(x*x-1)+x)) if x>2; else
                     24:  *             acosh(x) := log1p(t+sqrt(2.0*t+t*t)); where t=x-1.
                     25:  *
                     26:  * Special cases:
                     27:  *     acosh(x) is NaN with signal if x<1.
                     28:  *     acosh(NaN) is NaN without signal.
                     29:  */
                     30:
1.5       jtc        31: #include "math.h"
                     32: #include "math_private.h"
1.1       jtc        33:
                     34: #ifdef __STDC__
                     35: static const double
                     36: #else
                     37: static double
                     38: #endif
                     39: one    = 1.0,
                     40: ln2    = 6.93147180559945286227e-01;  /* 0x3FE62E42, 0xFEFA39EF */
                     41:
                     42: #ifdef __STDC__
                     43:        double __ieee754_acosh(double x)
                     44: #else
                     45:        double __ieee754_acosh(x)
                     46:        double x;
                     47: #endif
                     48: {
                     49:        double t;
1.6       jtc        50:        int32_t hx;
                     51:        u_int32_t lx;
1.5       jtc        52:        EXTRACT_WORDS(hx,lx,x);
1.1       jtc        53:        if(hx<0x3ff00000) {             /* x < 1 */
                     54:            return (x-x)/(x-x);
                     55:        } else if(hx >=0x41b00000) {    /* x > 2**28 */
                     56:            if(hx >=0x7ff00000) {       /* x is inf of NaN */
                     57:                return x+x;
                     58:            } else
                     59:                return __ieee754_log(x)+ln2;    /* acosh(huge)=log(2x) */
1.5       jtc        60:        } else if(((hx-0x3ff00000)|lx)==0) {
1.1       jtc        61:            return 0.0;                 /* acosh(1) = 0 */
                     62:        } else if (hx > 0x40000000) {   /* 2**28 > x > 2 */
                     63:            t=x*x;
1.9     ! jtc        64:            return __ieee754_log(2.0*x-one/(x+__ieee754_sqrt(t-one)));
1.1       jtc        65:        } else {                        /* 1<x<2 */
                     66:            t = x-one;
                     67:            return log1p(t+sqrt(2.0*t+t*t));
                     68:        }
                     69: }

CVSweb <webmaster@jp.NetBSD.org>