t2ex/bsd_source/lib/libc/src_bsd/math/e_acoshf.c | bare source | permlink (0.02 seconds) |
1: /* e_acoshf.c -- float version of e_acosh.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.0, 21: ln2 = 6.9314718246e-01; /* 0x3f317218 */ 22: 23: float 24: acoshf(float x) 25: { 26: float t; 27: int32_t hx; 28: GET_FLOAT_WORD(hx,x); 29: if(hx<0x3f800000) { /* x < 1 */ 30: return (x-x)/(x-x); 31: } else if(hx >=0x4d800000) { /* x > 2**28 */ 32: if(hx >=0x7f800000) { /* x is inf of NaN */ 33: return x+x; 34: } else 35: return logf(x)+ln2; /* acosh(huge)=log(2x) */ 36: } else if (hx==0x3f800000) { 37: return 0.0; /* acosh(1) = 0 */ 38: } else if (hx > 0x40000000) { /* 2**28 > x > 2 */ 39: t=x*x; 40: return logf((float)2.0*x-one/(x+sqrtf(t-one))); 41: } else { /* 1<x<2 */ 42: t = x-one; 43: return log1pf(t+sqrtf((float)2.0*t+t*t)); 44: } 45: }