11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* @(#)e_sinh.c 1.3 95/01/18 */ 31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ==================================================== 51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Developed at SunSoft, a Sun Microsystems, Inc. business. 81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Permission to use, copy, modify, and distribute this 91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * software is freely granted, provided that this notice 101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * is preserved. 111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ==================================================== 121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef lint 151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic char rcsid[] = "$FreeBSD: src/lib/msun/src/e_sinh.c,v 1.9 2005/02/04 18:26:06 das Exp $"; 161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* __ieee754_sinh(x) 191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Method : 201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * mathematically sinh(x) if defined to be (exp(x)-exp(-x))/2 211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 1. Replace x by |x| (sinh(-x) = -sinh(x)). 221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 2. 231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * E + E/(E+1) 241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 0 <= x <= 22 : sinh(x) := --------------, E=expm1(x) 251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 2 261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 22 <= x <= lnovft : sinh(x) := exp(x)/2 281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * lnovft <= x <= ln2ovft: sinh(x) := exp(x/2)/2 * exp(x/2) 291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ln2ovft < x : sinh(x) := x*shuge (overflow) 301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Special cases: 321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * sinh(x) is |x| if x is +INF, -INF, or NaN. 331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * only sinh(0)=0 is exact for finite x. 341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "math.h" 371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "math_private.h" 381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const double one = 1.0, shuge = 1.0e307; 401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectdouble 421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__ieee754_sinh(double x) 431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project double t,w,h; 451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int32_t ix,jx; 461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project u_int32_t lx; 471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* High word of |x|. */ 491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project GET_HIGH_WORD(jx,x); 501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ix = jx&0x7fffffff; 511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* x is INF or NaN */ 531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(ix>=0x7ff00000) return x+x; 541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project h = 0.5; 561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (jx<0) h = -h; 571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* |x| in [0,22], return sign(x)*0.5*(E+E/(E+1))) */ 581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ix < 0x40360000) { /* |x|<22 */ 591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ix<0x3e300000) /* |x|<2**-28 */ 601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(shuge+x>one) return x;/* sinh(tiny) = tiny with inexact */ 611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project t = expm1(fabs(x)); 621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(ix<0x3ff00000) return h*(2.0*t-t*t/(t+one)); 631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return h*(t+t/(t+one)); 641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* |x| in [22, log(maxdouble)] return 0.5*exp(|x|) */ 671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ix < 0x40862E42) return h*__ieee754_exp(fabs(x)); 681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* |x| in [log(maxdouble), overflowthresold] */ 701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project GET_LOW_WORD(lx,x); 711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ix<0x408633CE || ((ix==0x408633ce)&&(lx<=(u_int32_t)0x8fb9f87d))) { 721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project w = __ieee754_exp(0.5*fabs(x)); 731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project t = h*w; 741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return t*w; 751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* |x| > overflowthresold, sinh(x) overflow */ 781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return x*shuge; 791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 80