tor-browser

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

e_asinf.cpp (1618B)


      1 /* e_asinf.c -- float version of e_asin.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 huge =  1.000e+30,
     26 /* coefficient for R(x^2) */
     27 pS0 =  1.6666586697e-01,
     28 pS1 = -4.2743422091e-02,
     29 pS2 = -8.6563630030e-03,
     30 qS1 = -7.0662963390e-01;
     31 
     32 static const double
     33 pio2 =  1.570796326794896558e+00;
     34 
     35 float
     36 __ieee754_asinf(float x)
     37 {
     38 double s;
     39 float t,w,p,q;
     40 int32_t hx,ix;
     41 GET_FLOAT_WORD(hx,x);
     42 ix = hx&0x7fffffff;
     43 if(ix>=0x3f800000) {		/* |x| >= 1 */
     44     if(ix==0x3f800000)		/* |x| == 1 */
     45 	return x*pio2;		/* asin(+-1) = +-pi/2 with inexact */
     46     return (x-x)/(x-x);		/* asin(|x|>1) is NaN */
     47 } else if (ix<0x3f000000) {	/* |x|<0.5 */
     48     if(ix<0x39800000) {		/* |x| < 2**-12 */
     49 	if(huge+x>one) return x;/* return x with inexact if x!=0*/
     50     }
     51     t = x*x;
     52     p = t*(pS0+t*(pS1+t*pS2));
     53     q = one+t*qS1;
     54     w = p/q;
     55     return x+x*w;
     56 }
     57 /* 1> |x|>= 0.5 */
     58 w = one-fabsf(x);
     59 t = w*(float)0.5;
     60 p = t*(pS0+t*(pS1+t*pS2));
     61 q = one+t*qS1;
     62 s = sqrt(t);
     63 w = p/q;
     64 t = pio2-2.0*(s+s*w);
     65 if(hx>0) return t; else return -t;
     66 }