| The Android Open Source Project | 1dc9e47 | 2009-03-03 19:28:35 -0800 | [diff] [blame] | 1 | /* e_acosf.c -- float version of e_acos.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 | #ifndef lint | 
|  | 17 | static char rcsid[] = "$FreeBSD: src/lib/msun/src/e_acosf.c,v 1.7 2002/05/28 17:03:12 alfred Exp $"; | 
|  | 18 | #endif | 
|  | 19 |  | 
|  | 20 | #include "math.h" | 
|  | 21 | #include "math_private.h" | 
|  | 22 |  | 
|  | 23 | static const float | 
|  | 24 | one =  1.0000000000e+00, /* 0x3F800000 */ | 
|  | 25 | pi =  3.1415925026e+00, /* 0x40490fda */ | 
|  | 26 | pio2_hi =  1.5707962513e+00, /* 0x3fc90fda */ | 
|  | 27 | pio2_lo =  7.5497894159e-08, /* 0x33a22168 */ | 
|  | 28 | pS0 =  1.6666667163e-01, /* 0x3e2aaaab */ | 
|  | 29 | pS1 = -3.2556581497e-01, /* 0xbea6b090 */ | 
|  | 30 | pS2 =  2.0121252537e-01, /* 0x3e4e0aa8 */ | 
|  | 31 | pS3 = -4.0055535734e-02, /* 0xbd241146 */ | 
|  | 32 | pS4 =  7.9153501429e-04, /* 0x3a4f7f04 */ | 
|  | 33 | pS5 =  3.4793309169e-05, /* 0x3811ef08 */ | 
|  | 34 | qS1 = -2.4033949375e+00, /* 0xc019d139 */ | 
|  | 35 | qS2 =  2.0209457874e+00, /* 0x4001572d */ | 
|  | 36 | qS3 = -6.8828397989e-01, /* 0xbf303361 */ | 
|  | 37 | qS4 =  7.7038154006e-02; /* 0x3d9dc62e */ | 
|  | 38 |  | 
|  | 39 | float | 
|  | 40 | __ieee754_acosf(float x) | 
|  | 41 | { | 
|  | 42 | float z,p,q,r,w,s,c,df; | 
|  | 43 | int32_t hx,ix; | 
|  | 44 | GET_FLOAT_WORD(hx,x); | 
|  | 45 | ix = hx&0x7fffffff; | 
|  | 46 | if(ix==0x3f800000) {		/* |x|==1 */ | 
|  | 47 | if(hx>0) return 0.0;	/* acos(1) = 0  */ | 
|  | 48 | else return pi+(float)2.0*pio2_lo;	/* acos(-1)= pi */ | 
|  | 49 | } else if(ix>0x3f800000) {	/* |x| >= 1 */ | 
|  | 50 | return (x-x)/(x-x);		/* acos(|x|>1) is NaN */ | 
|  | 51 | } | 
|  | 52 | if(ix<0x3f000000) {	/* |x| < 0.5 */ | 
|  | 53 | if(ix<=0x23000000) return pio2_hi+pio2_lo;/*if|x|<2**-57*/ | 
|  | 54 | z = x*x; | 
|  | 55 | p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5))))); | 
|  | 56 | q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4))); | 
|  | 57 | r = p/q; | 
|  | 58 | return pio2_hi - (x - (pio2_lo-x*r)); | 
|  | 59 | } else  if (hx<0) {		/* x < -0.5 */ | 
|  | 60 | z = (one+x)*(float)0.5; | 
|  | 61 | p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5))))); | 
|  | 62 | q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4))); | 
|  | 63 | s = __ieee754_sqrtf(z); | 
|  | 64 | r = p/q; | 
|  | 65 | w = r*s-pio2_lo; | 
|  | 66 | return pi - (float)2.0*(s+w); | 
|  | 67 | } else {			/* x > 0.5 */ | 
|  | 68 | int32_t idf; | 
|  | 69 | z = (one-x)*(float)0.5; | 
|  | 70 | s = __ieee754_sqrtf(z); | 
|  | 71 | df = s; | 
|  | 72 | GET_FLOAT_WORD(idf,df); | 
|  | 73 | SET_FLOAT_WORD(df,idf&0xfffff000); | 
|  | 74 | c  = (z-df*df)/(s+df); | 
|  | 75 | p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5))))); | 
|  | 76 | q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4))); | 
|  | 77 | r = p/q; | 
|  | 78 | w = r*s+c; | 
|  | 79 | return (float)2.0*(df+w); | 
|  | 80 | } | 
|  | 81 | } |