1b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project 2b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project/* @(#)s_asinh.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/* asinh(x) 15b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * Method : 16b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * Based on 17b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * asinh(x) = sign(x) * log [ |x| + ieee_sqrt(x*x+1) ] 18b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * we have 19b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * asinh(x) := x if 1+x*x=1, 20b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * := sign(x)*(ieee_log(x)+ln2)) for large |x|, else 21b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * := sign(x)*ieee_log(2|x|+1/(|x|+ieee_sqrt(x*x+1))) if|x|>2, else 22b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project * := sign(x)*ieee_log1p(|x| + x^2/(1 + ieee_sqrt(1+x^2))) 23b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project */ 24b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project 25b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#include "fdlibm.h" 26b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project 27b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#ifdef __STDC__ 28b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Projectstatic const double 29b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#else 30b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Projectstatic double 31b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#endif 32b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Projectone = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */ 33b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Projectln2 = 6.93147180559945286227e-01, /* 0x3FE62E42, 0xFEFA39EF */ 34b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Projecthuge= 1.00000000000000000000e+300; 35b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project 36b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#ifdef __STDC__ 37b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project double asinh(double x) 38b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#else 39b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project double asinh(x) 40b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project double x; 41b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project#endif 42b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project{ 43b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project double t,w; 44b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project int hx,ix; 45b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project hx = __HI(x); 46b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project ix = hx&0x7fffffff; 47b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project if(ix>=0x7ff00000) return x+x; /* x is inf or NaN */ 48b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project if(ix< 0x3e300000) { /* |x|<2**-28 */ 49b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project if(huge+x>one) return x; /* return x inexact except 0 */ 50b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project } 51b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project if(ix>0x41b00000) { /* |x| > 2**28 */ 52b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project w = __ieee754_log(ieee_fabs(x))+ln2; 53b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project } else if (ix>0x40000000) { /* 2**28 > |x| > 2.0 */ 54b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project t = ieee_fabs(x); 55b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project w = __ieee754_log(2.0*t+one/(ieee_sqrt(x*x+one)+t)); 56b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project } else { /* 2.0 > |x| > 2**-28 */ 57b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project t = x*x; 58b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project w =ieee_log1p(ieee_fabs(x)+t/(one+ieee_sqrt(one+t))); 59b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project } 60b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project if(hx>0) return w; else return -w; 61b07e1d9fd8d9e4e03698e0bd9bf77154c5390326The Android Open Source Project} 62