t2ex/bsd_source/lib/libc/src_bsd/math/s_asinhf.c | bare source | permlink (0.00 seconds) |
1: /* s_asinhf.c -- float version of s_asinh.c. 2: * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com. 3: */ 4: 5: /* 6: * ==================================================== 7: * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 8: * 9: * Developed at SunPro, a Sun Microsystems, Inc. business. 10: * Permission to use, copy, modify, and distribute this 11: * software is freely granted, provided that this notice 12: * is preserved. 13: * ==================================================== 14: */ 15: 16: #include "math.h" 17: #include "math_private.h" 18: 19: static const float 20: one = 1.0000000000e+00, /* 0x3F800000 */ 21: ln2 = 6.9314718246e-01, /* 0x3f317218 */ 22: huge= 1.0000000000e+30; 23: 24: float 25: asinhf(float x) 26: { 27: float t,w; 28: int32_t hx,ix; 29: GET_FLOAT_WORD(hx,x); 30: ix = hx&0x7fffffff; 31: if(ix>=0x7f800000) return x+x; /* x is inf or NaN */ 32: if(ix< 0x31800000) { /* |x|<2**-28 */ 33: if(huge+x>one) return x; /* return x inexact except 0 */ 34: } 35: if(ix>0x4d800000) { /* |x| > 2**28 */ 36: w = logf(fabsf(x))+ln2; 37: } else if (ix>0x40000000) { /* 2**28 > |x| > 2.0 */ 38: t = fabsf(x); 39: w = logf((float)2.0*t+one/(sqrtf(x*x+one)+t)); 40: } else { /* 2.0 > |x| > 2**-28 */ 41: t = x*x; 42: w =log1pf(fabsf(x)+t/(one+sqrtf(one+t))); 43: } 44: if(hx>0) return w; else return -w; 45: }