tor-browser

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

e_rem_pio2f.cpp (1977B)


      1 /* e_rem_pio2f.c -- float version of e_rem_pio2.c
      2 * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
      3 * Debugged and optimized by Bruce D. Evans.
      4 */
      5 
      6 /*
      7 * ====================================================
      8 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
      9 *
     10 * Developed at SunPro, a Sun Microsystems, Inc. business.
     11 * Permission to use, copy, modify, and distribute this
     12 * software is freely granted, provided that this notice
     13 * is preserved.
     14 * ====================================================
     15 */
     16 
     17 //#include <sys/cdefs.h>
     18 //__FBSDID("$FreeBSD$");
     19 
     20 /* __ieee754_rem_pio2f(x,y)
     21 *
     22 * return the remainder of x rem pi/2 in *y
     23 * use double precision for everything except passing x
     24 * use __kernel_rem_pio2() for large x
     25 */
     26 
     27 #include <float.h>
     28 
     29 #include "math_private.h"
     30 
     31 /*
     32 * invpio2:  53 bits of 2/pi
     33 * pio2_1:   first 25 bits of pi/2
     34 * pio2_1t:  pi/2 - pio2_1
     35 */
     36 
     37 static const double
     38 invpio2 =  6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */
     39 pio2_1  =  1.57079631090164184570e+00, /* 0x3FF921FB, 0x50000000 */
     40 pio2_1t =  1.58932547735281966916e-08; /* 0x3E5110b4, 0x611A6263 */
     41 
     42 #ifdef INLINE_REM_PIO2F
     43 static inline
     44 #endif
     45 int
     46 __ieee754_rem_pio2f(float x, double *y)
     47 {
     48 double w,r,fn;
     49 double tx[1],ty[1];
     50 float z;
     51 int32_t e0,n,ix,hx;
     52 
     53 GET_FLOAT_WORD(hx,x);
     54 ix = hx&0x7fffffff;
     55    /* 33+53 bit pi is good enough for medium size */
     56 if(ix<0x4dc90fdb) {		/* |x| ~< 2^28*(pi/2), medium size */
     57     fn = rnint((float)x*invpio2);
     58     n  = irint(fn);
     59     r  = x-fn*pio2_1;
     60     w  = fn*pio2_1t;
     61     *y = r-w;
     62     return n;
     63 }
     64    /*
     65     * all other (large) arguments
     66     */
     67 if(ix>=0x7f800000) {		/* x is inf or NaN */
     68     *y=x-x; return 0;
     69 }
     70    /* set z = scalbn(|x|,ilogb(|x|)-23) */
     71 e0 = (ix>>23)-150;		/* e0 = ilogb(|x|)-23; */
     72 SET_FLOAT_WORD(z, ix - ((int32_t)(e0<<23)));
     73 tx[0] = z;
     74 n  =  __kernel_rem_pio2(tx,ty,e0,1,0);
     75 if(hx<0) {*y = -ty[0]; return -n;}
     76 *y = ty[0]; return n;
     77 }