tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

e_acosh.cpp (1609B)


      1 /* @(#)e_acosh.c 1.3 95/01/18 */
      2 /*
      3 * ====================================================
      4 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
      5 *
      6 * Developed at SunSoft, 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 *
     12 */
     13 
     14 //#include <sys/cdefs.h>
     15 //__FBSDID("$FreeBSD$");
     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 
     31 #include <float.h>
     32 #include <math.h>
     33 
     34 #include "math_private.h"
     35 
     36 static const double
     37 one	= 1.0,
     38 ln2	= 6.93147180559945286227e-01;  /* 0x3FE62E42, 0xFEFA39EF */
     39 
     40 double
     41 __ieee754_acosh(double x)
     42 {
     43 double t;
     44 int32_t hx;
     45 u_int32_t lx;
     46 EXTRACT_WORDS(hx,lx,x);
     47 if(hx<0x3ff00000) {		/* x < 1 */
     48     return (x-x)/(x-x);
     49 } else if(hx >=0x41b00000) {	/* x > 2**28 */
     50     if(hx >=0x7ff00000) {	/* x is inf of NaN */
     51         return x+x;
     52     } else 
     53 	return __ieee754_log(x)+ln2;	/* acosh(huge)=log(2x) */
     54 } else if(((hx-0x3ff00000)|lx)==0) {
     55     return 0.0;			/* acosh(1) = 0 */
     56 } else if (hx > 0x40000000) {	/* 2**28 > x > 2 */
     57     t=x*x;
     58     return __ieee754_log(2.0*x-one/(x+sqrt(t-one)));
     59 } else {			/* 1<x<2 */
     60     t = x-one;
     61     return log1p(t+sqrt(2.0*t+t*t));
     62 }
     63 }