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 14a0ee07829a9ba7e99ef68e8c12551301cc797f0fElliott Hughes#include <sys/cdefs.h> 15a0ee07829a9ba7e99ef68e8c12551301cc797f0fElliott Hughes__FBSDID("$FreeBSD$"); 161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* __ieee754_sinh(x) 181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Method : 191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * mathematically sinh(x) if defined to be (exp(x)-exp(-x))/2 201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 1. Replace x by |x| (sinh(-x) = -sinh(x)). 211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 2. 221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * E + E/(E+1) 231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 0 <= x <= 22 : sinh(x) := --------------, E=expm1(x) 241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 2 251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 22 <= x <= lnovft : sinh(x) := exp(x)/2 271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * lnovft <= x <= ln2ovft: sinh(x) := exp(x/2)/2 * exp(x/2) 281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ln2ovft < x : sinh(x) := x*shuge (overflow) 291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Special cases: 311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * sinh(x) is |x| if x is +INF, -INF, or NaN. 321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * only sinh(0)=0 is exact for finite x. 331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "math.h" 361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "math_private.h" 371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const double one = 1.0, shuge = 1.0e307; 391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectdouble 411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__ieee754_sinh(double x) 421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 43a0ee07829a9ba7e99ef68e8c12551301cc797f0fElliott Hughes double t,h; 441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int32_t ix,jx; 451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* High word of |x|. */ 471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project GET_HIGH_WORD(jx,x); 481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ix = jx&0x7fffffff; 491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* x is INF or NaN */ 511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(ix>=0x7ff00000) return x+x; 521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project h = 0.5; 541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (jx<0) h = -h; 551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* |x| in [0,22], return sign(x)*0.5*(E+E/(E+1))) */ 561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ix < 0x40360000) { /* |x|<22 */ 571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ix<0x3e300000) /* |x|<2**-28 */ 581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(shuge+x>one) return x;/* sinh(tiny) = tiny with inexact */ 591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project t = expm1(fabs(x)); 601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if(ix<0x3ff00000) return h*(2.0*t-t*t/(t+one)); 611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return h*(t+t/(t+one)); 621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* |x| in [22, log(maxdouble)] return 0.5*exp(|x|) */ 651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ix < 0x40862E42) return h*__ieee754_exp(fabs(x)); 661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* |x| in [log(maxdouble), overflowthresold] */ 68a0ee07829a9ba7e99ef68e8c12551301cc797f0fElliott Hughes if (ix<=0x408633CE) 69a0ee07829a9ba7e99ef68e8c12551301cc797f0fElliott Hughes return h*2.0*__ldexp_exp(fabs(x), -1); 701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* |x| > overflowthresold, sinh(x) overflow */ 721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return x*shuge; 731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 74