tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

e_acosf.cpp (2045B)


      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 //#include <sys/cdefs.h>
     17 //__FBSDID("$FreeBSD$");
     18 
     19 #include <math.h>
     20 
     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 static volatile float
     28 pio2_lo =  7.5497894159e-08; /* 0x33a22168 */
     29 static const float
     30 pS0 =  1.6666586697e-01,
     31 pS1 = -4.2743422091e-02,
     32 pS2 = -8.6563630030e-03,
     33 qS1 = -7.0662963390e-01;
     34 
     35 float
     36 __ieee754_acosf(float x)
     37 {
     38 float z,p,q,r,w,s,c,df;
     39 int32_t hx,ix;
     40 GET_FLOAT_WORD(hx,x);
     41 ix = hx&0x7fffffff;
     42 if(ix>=0x3f800000) {		/* |x| >= 1 */
     43     if(ix==0x3f800000) {	/* |x| == 1 */
     44 	if(hx>0) return 0.0;	/* acos(1) = 0 */
     45 	else return pi+(float)2.0*pio2_lo;	/* acos(-1)= pi */
     46     }
     47     return (x-x)/(x-x);		/* acos(|x|>1) is NaN */
     48 }
     49 if(ix<0x3f000000) {	/* |x| < 0.5 */
     50     if(ix<=0x32800000) return pio2_hi+pio2_lo;/*if|x|<2**-26*/
     51     z = x*x;
     52     p = z*(pS0+z*(pS1+z*pS2));
     53     q = one+z*qS1;
     54     r = p/q;
     55     return pio2_hi - (x - (pio2_lo-x*r));
     56 } else  if (hx<0) {		/* x < -0.5 */
     57     z = (one+x)*(float)0.5;
     58     p = z*(pS0+z*(pS1+z*pS2));
     59     q = one+z*qS1;
     60     s = sqrtf(z);
     61     r = p/q;
     62     w = r*s-pio2_lo;
     63     return pi - (float)2.0*(s+w);
     64 } else {			/* x > 0.5 */
     65     int32_t idf;
     66     z = (one-x)*(float)0.5;
     67     s = sqrtf(z);
     68     df = s;
     69     GET_FLOAT_WORD(idf,df);
     70     SET_FLOAT_WORD(df,idf&0xfffff000);
     71     c  = (z-df*df)/(s+df);
     72     p = z*(pS0+z*(pS1+z*pS2));
     73     q = one+z*qS1;
     74     r = p/q;
     75     w = r*s+c;
     76     return (float)2.0*(df+w);
     77 }
     78 }