1b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project 2b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project/* @(#)e_atanh.c 1.3 95/01/18 */ 3b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project/* 4b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * ==================================================== 5b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 6b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * 7b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * Developed at SunSoft, a Sun Microsystems, Inc. business. 8b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * Permission to use, copy, modify, and distribute this 9b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * software is freely granted, provided that this notice 10b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * is preserved. 11b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * ==================================================== 12b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * 13b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project */ 14b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project 15b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project/* __ieee754_atanh(x) 16b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * Method : 17b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * 1.Reduced x to positive by atanh(-x) = -atanh(x) 18b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * 2.For x>=0.5 19b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * 1 2x x 20b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * atanh(x) = --- * ieee_log(1 + -------) = 0.5 * ieee_log1p(2 * --------) 21b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * 2 1 - x 1 - x 22b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * 23b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * For x<0.5 24b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * atanh(x) = 0.5*ieee_log1p(2x+2x*x/(1-x)) 25b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * 26b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * Special cases: 27b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * atanh(x) is NaN if |x| > 1 with signal; 28b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * atanh(NaN) is that NaN with no signal; 29b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * atanh(+-1) is +-INF with signal. 30b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * 31b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project */ 32b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project 33b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#include "fdlibm.h" 34b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project 35b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#ifdef __STDC__ 36b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Projectstatic const double one = 1.0, huge = 1e300; 37b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#else 38b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Projectstatic double one = 1.0, huge = 1e300; 39b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#endif 40b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project 41b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Projectstatic double zero = 0.0; 42b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project 43b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#ifdef __STDC__ 44b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project double __ieee754_atanh(double x) 45b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#else 46b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project double __ieee754_atanh(x) 47b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project double x; 48b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#endif 49b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project{ 50b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project double t; 51b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project int hx,ix; 52b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project unsigned lx; 53b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project hx = __HI(x); /* high word */ 54b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project lx = __LO(x); /* low word */ 55b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project ix = hx&0x7fffffff; 56b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project if ((ix|((lx|(-lx))>>31))>0x3ff00000) /* |x|>1 */ 57b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project return (x-x)/(x-x); 58b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project if(ix==0x3ff00000) 59b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project return x/zero; 60b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project if(ix<0x3e300000&&(huge+x)>zero) return x; /* x<2**-28 */ 61b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project __HI(x) = ix; /* x <- |x| */ 62b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project if(ix<0x3fe00000) { /* x < 0.5 */ 63b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project t = x+x; 64b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project t = 0.5*ieee_log1p(t+t*x/(one-x)); 65b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project } else 66b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project t = 0.5*ieee_log1p((x+x)/(one-x)); 67b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project if(hx>=0) return t; else return -t; 68b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project} 69