1 1.1 mrg #include "quadmath-imp.h" 2 1.1 mrg #include <math.h> 3 1.1 mrg 4 1.1 mrg 5 1.1 mrg /* @(#)k_rem_pio2.c 5.1 93/09/24 */ 6 1.1 mrg /* 7 1.1 mrg * ==================================================== 8 1.1 mrg * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 9 1.1 mrg * 10 1.1 mrg * Developed at SunPro, a Sun Microsystems, Inc. business. 11 1.1 mrg * Permission to use, copy, modify, and distribute this 12 1.1 mrg * software is freely granted, provided that this notice 13 1.1 mrg * is preserved. 14 1.1 mrg * ==================================================== 15 1.1 mrg */ 16 1.1 mrg 17 1.1 mrg /* 18 1.1 mrg * __quadmath_kernel_rem_pio2 (x,y,e0,nx,prec,ipio2) 19 1.1 mrg * double x[],y[]; int e0,nx,prec; int ipio2[]; 20 1.1 mrg * 21 1.1 mrg * __quadmath_kernel_rem_pio2 return the last three digits of N with 22 1.1 mrg * y = x - N*pi/2 23 1.1 mrg * so that |y| < pi/2. 24 1.1 mrg * 25 1.1 mrg * The method is to compute the integer (mod 8) and fraction parts of 26 1.1 mrg * (2/pi)*x without doing the full multiplication. In general we 27 1.1 mrg * skip the part of the product that are known to be a huge integer ( 28 1.1 mrg * more accurately, = 0 mod 8 ). Thus the number of operations are 29 1.1 mrg * independent of the exponent of the input. 30 1.1 mrg * 31 1.1 mrg * (2/pi) is represented by an array of 24-bit integers in ipio2[]. 32 1.1 mrg * 33 1.1 mrg * Input parameters: 34 1.1 mrg * x[] The input value (must be positive) is broken into nx 35 1.1 mrg * pieces of 24-bit integers in double precision format. 36 1.1 mrg * x[i] will be the i-th 24 bit of x. The scaled exponent 37 1.1 mrg * of x[0] is given in input parameter e0 (i.e., x[0]*2^e0 38 1.1 mrg * match x's up to 24 bits. 39 1.1 mrg * 40 1.1 mrg * Example of breaking a double positive z into x[0]+x[1]+x[2]: 41 1.1 mrg * e0 = ilogb(z)-23 42 1.1 mrg * z = scalbn(z,-e0) 43 1.1 mrg * for i = 0,1,2 44 1.1 mrg * x[i] = floor(z) 45 1.1 mrg * z = (z-x[i])*2**24 46 1.1 mrg * 47 1.1 mrg * 48 1.1 mrg * y[] ouput result in an array of double precision numbers. 49 1.1 mrg * The dimension of y[] is: 50 1.1 mrg * 24-bit precision 1 51 1.1 mrg * 53-bit precision 2 52 1.1 mrg * 64-bit precision 2 53 1.1 mrg * 113-bit precision 3 54 1.1 mrg * The actual value is the sum of them. Thus for 113-bit 55 1.1 mrg * precision, one may have to do something like: 56 1.1 mrg * 57 1.1 mrg * long double t,w,r_head, r_tail; 58 1.1 mrg * t = (long double)y[2] + (long double)y[1]; 59 1.1 mrg * w = (long double)y[0]; 60 1.1 mrg * r_head = t+w; 61 1.1 mrg * r_tail = w - (r_head - t); 62 1.1 mrg * 63 1.1 mrg * e0 The exponent of x[0] 64 1.1 mrg * 65 1.1 mrg * nx dimension of x[] 66 1.1 mrg * 67 1.1 mrg * prec an integer indicating the precision: 68 1.1 mrg * 0 24 bits (single) 69 1.1 mrg * 1 53 bits (double) 70 1.1 mrg * 2 64 bits (extended) 71 1.1 mrg * 3 113 bits (quad) 72 1.1 mrg * 73 1.1 mrg * ipio2[] 74 1.1 mrg * integer array, contains the (24*i)-th to (24*i+23)-th 75 1.1 mrg * bit of 2/pi after binary point. The corresponding 76 1.1 mrg * floating value is 77 1.1 mrg * 78 1.1 mrg * ipio2[i] * 2^(-24(i+1)). 79 1.1 mrg * 80 1.1 mrg * External function: 81 1.1 mrg * double scalbn(), floor(); 82 1.1 mrg * 83 1.1 mrg * 84 1.1 mrg * Here is the description of some local variables: 85 1.1 mrg * 86 1.1 mrg * jk jk+1 is the initial number of terms of ipio2[] needed 87 1.1 mrg * in the computation. The recommended value is 2,3,4, 88 1.1 mrg * 6 for single, double, extended,and quad. 89 1.1 mrg * 90 1.1 mrg * jz local integer variable indicating the number of 91 1.1 mrg * terms of ipio2[] used. 92 1.1 mrg * 93 1.1 mrg * jx nx - 1 94 1.1 mrg * 95 1.1 mrg * jv index for pointing to the suitable ipio2[] for the 96 1.1 mrg * computation. In general, we want 97 1.1 mrg * ( 2^e0*x[0] * ipio2[jv-1]*2^(-24jv) )/8 98 1.1 mrg * is an integer. Thus 99 1.1 mrg * e0-3-24*jv >= 0 or (e0-3)/24 >= jv 100 1.1 mrg * Hence jv = max(0,(e0-3)/24). 101 1.1 mrg * 102 1.1 mrg * jp jp+1 is the number of terms in PIo2[] needed, jp = jk. 103 1.1 mrg * 104 1.1 mrg * q[] double array with integral value, representing the 105 1.1 mrg * 24-bits chunk of the product of x and 2/pi. 106 1.1 mrg * 107 1.1 mrg * q0 the corresponding exponent of q[0]. Note that the 108 1.1 mrg * exponent for q[i] would be q0-24*i. 109 1.1 mrg * 110 1.1 mrg * PIo2[] double precision array, obtained by cutting pi/2 111 1.1 mrg * into 24 bits chunks. 112 1.1 mrg * 113 1.1 mrg * f[] ipio2[] in floating point 114 1.1 mrg * 115 1.1 mrg * iq[] integer array by breaking up q[] in 24-bits chunk. 116 1.1 mrg * 117 1.1 mrg * fq[] final product of x*(2/pi) in fq[0],..,fq[jk] 118 1.1 mrg * 119 1.1 mrg * ih integer. If >0 it indicates q[] is >= 0.5, hence 120 1.1 mrg * it also indicates the *sign* of the result. 121 1.1 mrg * 122 1.1 mrg */ 123 1.1 mrg 124 1.1 mrg /* 125 1.1 mrg * Constants: 126 1.1 mrg * The hexadecimal values are the intended ones for the following 127 1.1 mrg * constants. The decimal values may be used, provided that the 128 1.1 mrg * compiler will convert from decimal to binary accurately enough 129 1.1 mrg * to produce the hexadecimal values shown. 130 1.1 mrg */ 131 1.1 mrg 132 1.1 mrg 133 1.1 mrg static const int init_jk[] = {2,3,4,6}; /* initial value for jk */ 134 1.1 mrg 135 1.1 mrg static const double PIo2[] = { 136 1.1 mrg 1.57079625129699707031e+00, /* 0x3FF921FB, 0x40000000 */ 137 1.1 mrg 7.54978941586159635335e-08, /* 0x3E74442D, 0x00000000 */ 138 1.1 mrg 5.39030252995776476554e-15, /* 0x3CF84698, 0x80000000 */ 139 1.1 mrg 3.28200341580791294123e-22, /* 0x3B78CC51, 0x60000000 */ 140 1.1 mrg 1.27065575308067607349e-29, /* 0x39F01B83, 0x80000000 */ 141 1.1 mrg 1.22933308981111328932e-36, /* 0x387A2520, 0x40000000 */ 142 1.1 mrg 2.73370053816464559624e-44, /* 0x36E38222, 0x80000000 */ 143 1.1 mrg 2.16741683877804819444e-51, /* 0x3569F31D, 0x00000000 */ 144 1.1 mrg }; 145 1.1 mrg 146 1.1 mrg static const double 147 1.1 mrg zero = 0.0, 148 1.1 mrg one = 1.0, 149 1.1 mrg two24 = 1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */ 150 1.1 mrg twon24 = 5.96046447753906250000e-08; /* 0x3E700000, 0x00000000 */ 151 1.1 mrg 152 1.1 mrg 153 1.1 mrg static int 154 1.1 mrg __quadmath_kernel_rem_pio2 (double *x, double *y, int e0, int nx, int prec, const int32_t *ipio2) 155 1.1 mrg { 156 1.1 mrg int32_t jz,jx,jv,jp,jk,carry,n,iq[20],i,j,k,m,q0,ih; 157 1.1 mrg double z,fw,f[20],fq[20],q[20]; 158 1.1 mrg 159 1.1 mrg /* initialize jk*/ 160 1.1 mrg jk = init_jk[prec]; 161 1.1 mrg jp = jk; 162 1.1 mrg 163 1.1 mrg /* determine jx,jv,q0, note that 3>q0 */ 164 1.1 mrg jx = nx-1; 165 1.1 mrg jv = (e0-3)/24; if(jv<0) jv=0; 166 1.1 mrg q0 = e0-24*(jv+1); 167 1.1 mrg 168 1.1 mrg /* set up f[0] to f[jx+jk] where f[jx+jk] = ipio2[jv+jk] */ 169 1.1 mrg j = jv-jx; m = jx+jk; 170 1.1 mrg for(i=0;i<=m;i++,j++) f[i] = (j<0)? zero : (double) ipio2[j]; 171 1.1 mrg 172 1.1 mrg /* compute q[0],q[1],...q[jk] */ 173 1.1 mrg for (i=0;i<=jk;i++) { 174 1.2 mrg for(j=0,fw=0.0;j<=jx;j++) fw += x[j]*f[jx+i-j]; 175 1.2 mrg q[i] = fw; 176 1.1 mrg } 177 1.1 mrg 178 1.1 mrg jz = jk; 179 1.1 mrg recompute: 180 1.1 mrg /* distill q[] into iq[] reversingly */ 181 1.1 mrg for(i=0,j=jz,z=q[jz];j>0;i++,j--) { 182 1.1 mrg fw = (double)((int32_t)(twon24* z)); 183 1.1 mrg iq[i] = (int32_t)(z-two24*fw); 184 1.1 mrg z = q[j-1]+fw; 185 1.1 mrg } 186 1.1 mrg 187 1.1 mrg /* compute n */ 188 1.1 mrg z = scalbn(z,q0); /* actual value of z */ 189 1.1 mrg z -= 8.0*floor(z*0.125); /* trim off integer >= 8 */ 190 1.1 mrg n = (int32_t) z; 191 1.1 mrg z -= (double)n; 192 1.1 mrg ih = 0; 193 1.1 mrg if(q0>0) { /* need iq[jz-1] to determine n */ 194 1.1 mrg i = (iq[jz-1]>>(24-q0)); n += i; 195 1.1 mrg iq[jz-1] -= i<<(24-q0); 196 1.1 mrg ih = iq[jz-1]>>(23-q0); 197 1.1 mrg } 198 1.1 mrg else if(q0==0) ih = iq[jz-1]>>23; 199 1.1 mrg else if(z>=0.5) ih=2; 200 1.1 mrg 201 1.1 mrg if(ih>0) { /* q > 0.5 */ 202 1.1 mrg n += 1; carry = 0; 203 1.1 mrg for(i=0;i<jz ;i++) { /* compute 1-q */ 204 1.1 mrg j = iq[i]; 205 1.1 mrg if(carry==0) { 206 1.1 mrg if(j!=0) { 207 1.1 mrg carry = 1; iq[i] = 0x1000000- j; 208 1.1 mrg } 209 1.1 mrg } else iq[i] = 0xffffff - j; 210 1.1 mrg } 211 1.1 mrg if(q0>0) { /* rare case: chance is 1 in 12 */ 212 1.1 mrg switch(q0) { 213 1.1 mrg case 1: 214 1.1 mrg iq[jz-1] &= 0x7fffff; break; 215 1.1 mrg case 2: 216 1.1 mrg iq[jz-1] &= 0x3fffff; break; 217 1.1 mrg } 218 1.1 mrg } 219 1.1 mrg if(ih==2) { 220 1.1 mrg z = one - z; 221 1.1 mrg if(carry!=0) z -= scalbn(one,q0); 222 1.1 mrg } 223 1.1 mrg } 224 1.1 mrg 225 1.1 mrg /* check if recomputation is needed */ 226 1.1 mrg if(z==zero) { 227 1.1 mrg j = 0; 228 1.1 mrg for (i=jz-1;i>=jk;i--) j |= iq[i]; 229 1.1 mrg if(j==0) { /* need recomputation */ 230 1.1 mrg for(k=1;iq[jk-k]==0;k++); /* k = no. of terms needed */ 231 1.1 mrg 232 1.1 mrg for(i=jz+1;i<=jz+k;i++) { /* add q[jz+1] to q[jz+k] */ 233 1.1 mrg f[jx+i] = (double) ipio2[jv+i]; 234 1.1 mrg for(j=0,fw=0.0;j<=jx;j++) fw += x[j]*f[jx+i-j]; 235 1.1 mrg q[i] = fw; 236 1.1 mrg } 237 1.1 mrg jz += k; 238 1.1 mrg goto recompute; 239 1.1 mrg } 240 1.1 mrg } 241 1.1 mrg 242 1.1 mrg /* chop off zero terms */ 243 1.1 mrg if(z==0.0) { 244 1.1 mrg jz -= 1; q0 -= 24; 245 1.1 mrg while(iq[jz]==0) { jz--; q0-=24;} 246 1.1 mrg } else { /* break z into 24-bit if necessary */ 247 1.1 mrg z = scalbn(z,-q0); 248 1.1 mrg if(z>=two24) { 249 1.1 mrg fw = (double)((int32_t)(twon24*z)); 250 1.1 mrg iq[jz] = (int32_t)(z-two24*fw); 251 1.1 mrg jz += 1; q0 += 24; 252 1.1 mrg iq[jz] = (int32_t) fw; 253 1.1 mrg } else iq[jz] = (int32_t) z ; 254 1.1 mrg } 255 1.1 mrg 256 1.1 mrg /* convert integer "bit" chunk to floating-point value */ 257 1.1 mrg fw = scalbn(one,q0); 258 1.1 mrg for(i=jz;i>=0;i--) { 259 1.1 mrg q[i] = fw*(double)iq[i]; fw*=twon24; 260 1.1 mrg } 261 1.1 mrg 262 1.1 mrg /* compute PIo2[0,...,jp]*q[jz,...,0] */ 263 1.1 mrg for(i=jz;i>=0;i--) { 264 1.1 mrg for(fw=0.0,k=0;k<=jp&&k<=jz-i;k++) fw += PIo2[k]*q[i+k]; 265 1.1 mrg fq[jz-i] = fw; 266 1.1 mrg } 267 1.1 mrg 268 1.1 mrg /* compress fq[] into y[] */ 269 1.1 mrg switch(prec) { 270 1.1 mrg case 0: 271 1.1 mrg fw = 0.0; 272 1.1 mrg for (i=jz;i>=0;i--) fw += fq[i]; 273 1.1 mrg y[0] = (ih==0)? fw: -fw; 274 1.1 mrg break; 275 1.1 mrg case 1: 276 1.1 mrg case 2: 277 1.1 mrg fw = 0.0; 278 1.1 mrg for (i=jz;i>=0;i--) fw += fq[i]; 279 1.1 mrg y[0] = (ih==0)? fw: -fw; 280 1.1 mrg fw = fq[0]-fw; 281 1.1 mrg for (i=1;i<=jz;i++) fw += fq[i]; 282 1.1 mrg y[1] = (ih==0)? fw: -fw; 283 1.1 mrg break; 284 1.1 mrg case 3: /* painful */ 285 1.1 mrg for (i=jz;i>0;i--) { 286 1.1 mrg #if __FLT_EVAL_METHOD__ != 0 287 1.1 mrg volatile 288 1.1 mrg #endif 289 1.1 mrg double fv = (double)(fq[i-1]+fq[i]); 290 1.1 mrg fq[i] += fq[i-1]-fv; 291 1.1 mrg fq[i-1] = fv; 292 1.1 mrg } 293 1.1 mrg for (i=jz;i>1;i--) { 294 1.1 mrg #if __FLT_EVAL_METHOD__ != 0 295 1.1 mrg volatile 296 1.1 mrg #endif 297 1.1 mrg double fv = (double)(fq[i-1]+fq[i]); 298 1.1 mrg fq[i] += fq[i-1]-fv; 299 1.1 mrg fq[i-1] = fv; 300 1.1 mrg } 301 1.1 mrg for (fw=0.0,i=jz;i>=2;i--) fw += fq[i]; 302 1.1 mrg if(ih==0) { 303 1.1 mrg y[0] = fq[0]; y[1] = fq[1]; y[2] = fw; 304 1.1 mrg } else { 305 1.1 mrg y[0] = -fq[0]; y[1] = -fq[1]; y[2] = -fw; 306 1.1 mrg } 307 1.1 mrg } 308 1.1 mrg return n&7; 309 1.1 mrg } 310 1.1 mrg 311 1.1 mrg 312 1.1 mrg 313 1.1 mrg 315 1.1 mrg 316 1.1 mrg /* Quad-precision floating point argument reduction. 317 1.1 mrg Copyright (C) 1999-2017 Free Software Foundation, Inc. 318 1.1 mrg This file is part of the GNU C Library. 319 1.1 mrg Contributed by Jakub Jelinek <jj (at) ultra.linux.cz> 320 1.1 mrg 321 1.1 mrg The GNU C Library is free software; you can redistribute it and/or 322 1.1 mrg modify it under the terms of the GNU Lesser General Public 323 1.1 mrg License as published by the Free Software Foundation; either 324 1.1 mrg version 2.1 of the License, or (at your option) any later version. 325 1.1 mrg 326 1.1 mrg The GNU C Library is distributed in the hope that it will be useful, 327 1.1 mrg but WITHOUT ANY WARRANTY; without even the implied warranty of 328 1.1 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 329 1.1 mrg Lesser General Public License for more details. 330 1.1 mrg 331 1.1 mrg You should have received a copy of the GNU Lesser General Public 332 1.1 mrg License along with the GNU C Library; if not, write to the Free 333 1.1 mrg Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 334 1.1 mrg 02111-1307 USA. */ 335 1.1 mrg 336 1.1 mrg /* 337 1.1 mrg * Table of constants for 2/pi, 5628 hexadecimal digits of 2/pi 338 1.1 mrg */ 339 1.1 mrg static const int32_t two_over_pi[] = { 340 1.1 mrg 0xa2f983, 0x6e4e44, 0x1529fc, 0x2757d1, 0xf534dd, 0xc0db62, 341 1.1 mrg 0x95993c, 0x439041, 0xfe5163, 0xabdebb, 0xc561b7, 0x246e3a, 342 1.1 mrg 0x424dd2, 0xe00649, 0x2eea09, 0xd1921c, 0xfe1deb, 0x1cb129, 343 1.1 mrg 0xa73ee8, 0x8235f5, 0x2ebb44, 0x84e99c, 0x7026b4, 0x5f7e41, 344 1.1 mrg 0x3991d6, 0x398353, 0x39f49c, 0x845f8b, 0xbdf928, 0x3b1ff8, 345 1.1 mrg 0x97ffde, 0x05980f, 0xef2f11, 0x8b5a0a, 0x6d1f6d, 0x367ecf, 346 1.1 mrg 0x27cb09, 0xb74f46, 0x3f669e, 0x5fea2d, 0x7527ba, 0xc7ebe5, 347 1.1 mrg 0xf17b3d, 0x0739f7, 0x8a5292, 0xea6bfb, 0x5fb11f, 0x8d5d08, 348 1.1 mrg 0x560330, 0x46fc7b, 0x6babf0, 0xcfbc20, 0x9af436, 0x1da9e3, 349 1.1 mrg 0x91615e, 0xe61b08, 0x659985, 0x5f14a0, 0x68408d, 0xffd880, 350 1.1 mrg 0x4d7327, 0x310606, 0x1556ca, 0x73a8c9, 0x60e27b, 0xc08c6b, 351 1.1 mrg 0x47c419, 0xc367cd, 0xdce809, 0x2a8359, 0xc4768b, 0x961ca6, 352 1.1 mrg 0xddaf44, 0xd15719, 0x053ea5, 0xff0705, 0x3f7e33, 0xe832c2, 353 1.1 mrg 0xde4f98, 0x327dbb, 0xc33d26, 0xef6b1e, 0x5ef89f, 0x3a1f35, 354 1.1 mrg 0xcaf27f, 0x1d87f1, 0x21907c, 0x7c246a, 0xfa6ed5, 0x772d30, 355 1.1 mrg 0x433b15, 0xc614b5, 0x9d19c3, 0xc2c4ad, 0x414d2c, 0x5d000c, 356 1.1 mrg 0x467d86, 0x2d71e3, 0x9ac69b, 0x006233, 0x7cd2b4, 0x97a7b4, 357 1.1 mrg 0xd55537, 0xf63ed7, 0x1810a3, 0xfc764d, 0x2a9d64, 0xabd770, 358 1.1 mrg 0xf87c63, 0x57b07a, 0xe71517, 0x5649c0, 0xd9d63b, 0x3884a7, 359 1.1 mrg 0xcb2324, 0x778ad6, 0x23545a, 0xb91f00, 0x1b0af1, 0xdfce19, 360 1.1 mrg 0xff319f, 0x6a1e66, 0x615799, 0x47fbac, 0xd87f7e, 0xb76522, 361 1.1 mrg 0x89e832, 0x60bfe6, 0xcdc4ef, 0x09366c, 0xd43f5d, 0xd7de16, 362 1.1 mrg 0xde3b58, 0x929bde, 0x2822d2, 0xe88628, 0x4d58e2, 0x32cac6, 363 1.1 mrg 0x16e308, 0xcb7de0, 0x50c017, 0xa71df3, 0x5be018, 0x34132e, 364 1.1 mrg 0x621283, 0x014883, 0x5b8ef5, 0x7fb0ad, 0xf2e91e, 0x434a48, 365 1.1 mrg 0xd36710, 0xd8ddaa, 0x425fae, 0xce616a, 0xa4280a, 0xb499d3, 366 1.1 mrg 0xf2a606, 0x7f775c, 0x83c2a3, 0x883c61, 0x78738a, 0x5a8caf, 367 1.1 mrg 0xbdd76f, 0x63a62d, 0xcbbff4, 0xef818d, 0x67c126, 0x45ca55, 368 1.1 mrg 0x36d9ca, 0xd2a828, 0x8d61c2, 0x77c912, 0x142604, 0x9b4612, 369 1.1 mrg 0xc459c4, 0x44c5c8, 0x91b24d, 0xf31700, 0xad43d4, 0xe54929, 370 1.1 mrg 0x10d5fd, 0xfcbe00, 0xcc941e, 0xeece70, 0xf53e13, 0x80f1ec, 371 1.1 mrg 0xc3e7b3, 0x28f8c7, 0x940593, 0x3e71c1, 0xb3092e, 0xf3450b, 372 1.1 mrg 0x9c1288, 0x7b20ab, 0x9fb52e, 0xc29247, 0x2f327b, 0x6d550c, 373 1.1 mrg 0x90a772, 0x1fe76b, 0x96cb31, 0x4a1679, 0xe27941, 0x89dff4, 374 1.1 mrg 0x9794e8, 0x84e6e2, 0x973199, 0x6bed88, 0x365f5f, 0x0efdbb, 375 1.1 mrg 0xb49a48, 0x6ca467, 0x427271, 0x325d8d, 0xb8159f, 0x09e5bc, 376 1.1 mrg 0x25318d, 0x3974f7, 0x1c0530, 0x010c0d, 0x68084b, 0x58ee2c, 377 1.1 mrg 0x90aa47, 0x02e774, 0x24d6bd, 0xa67df7, 0x72486e, 0xef169f, 378 1.1 mrg 0xa6948e, 0xf691b4, 0x5153d1, 0xf20acf, 0x339820, 0x7e4bf5, 379 1.1 mrg 0x6863b2, 0x5f3edd, 0x035d40, 0x7f8985, 0x295255, 0xc06437, 380 1.1 mrg 0x10d86d, 0x324832, 0x754c5b, 0xd4714e, 0x6e5445, 0xc1090b, 381 1.1 mrg 0x69f52a, 0xd56614, 0x9d0727, 0x50045d, 0xdb3bb4, 0xc576ea, 382 1.1 mrg 0x17f987, 0x7d6b49, 0xba271d, 0x296996, 0xacccc6, 0x5414ad, 383 1.1 mrg 0x6ae290, 0x89d988, 0x50722c, 0xbea404, 0x940777, 0x7030f3, 384 1.1 mrg 0x27fc00, 0xa871ea, 0x49c266, 0x3de064, 0x83dd97, 0x973fa3, 385 1.1 mrg 0xfd9443, 0x8c860d, 0xde4131, 0x9d3992, 0x8c70dd, 0xe7b717, 386 1.1 mrg 0x3bdf08, 0x2b3715, 0xa0805c, 0x93805a, 0x921110, 0xd8e80f, 387 1.1 mrg 0xaf806c, 0x4bffdb, 0x0f9038, 0x761859, 0x15a562, 0xbbcb61, 388 1.1 mrg 0xb989c7, 0xbd4010, 0x04f2d2, 0x277549, 0xf6b6eb, 0xbb22db, 389 1.1 mrg 0xaa140a, 0x2f2689, 0x768364, 0x333b09, 0x1a940e, 0xaa3a51, 390 1.1 mrg 0xc2a31d, 0xaeedaf, 0x12265c, 0x4dc26d, 0x9c7a2d, 0x9756c0, 391 1.1 mrg 0x833f03, 0xf6f009, 0x8c402b, 0x99316d, 0x07b439, 0x15200c, 392 1.1 mrg 0x5bc3d8, 0xc492f5, 0x4badc6, 0xa5ca4e, 0xcd37a7, 0x36a9e6, 393 1.1 mrg 0x9492ab, 0x6842dd, 0xde6319, 0xef8c76, 0x528b68, 0x37dbfc, 394 1.1 mrg 0xaba1ae, 0x3115df, 0xa1ae00, 0xdafb0c, 0x664d64, 0xb705ed, 395 1.1 mrg 0x306529, 0xbf5657, 0x3aff47, 0xb9f96a, 0xf3be75, 0xdf9328, 396 1.1 mrg 0x3080ab, 0xf68c66, 0x15cb04, 0x0622fa, 0x1de4d9, 0xa4b33d, 397 1.1 mrg 0x8f1b57, 0x09cd36, 0xe9424e, 0xa4be13, 0xb52333, 0x1aaaf0, 398 1.1 mrg 0xa8654f, 0xa5c1d2, 0x0f3f0b, 0xcd785b, 0x76f923, 0x048b7b, 399 1.1 mrg 0x721789, 0x53a6c6, 0xe26e6f, 0x00ebef, 0x584a9b, 0xb7dac4, 400 1.1 mrg 0xba66aa, 0xcfcf76, 0x1d02d1, 0x2df1b1, 0xc1998c, 0x77adc3, 401 1.1 mrg 0xda4886, 0xa05df7, 0xf480c6, 0x2ff0ac, 0x9aecdd, 0xbc5c3f, 402 1.1 mrg 0x6dded0, 0x1fc790, 0xb6db2a, 0x3a25a3, 0x9aaf00, 0x9353ad, 403 1.1 mrg 0x0457b6, 0xb42d29, 0x7e804b, 0xa707da, 0x0eaa76, 0xa1597b, 404 1.1 mrg 0x2a1216, 0x2db7dc, 0xfde5fa, 0xfedb89, 0xfdbe89, 0x6c76e4, 405 1.1 mrg 0xfca906, 0x70803e, 0x156e85, 0xff87fd, 0x073e28, 0x336761, 406 1.1 mrg 0x86182a, 0xeabd4d, 0xafe7b3, 0x6e6d8f, 0x396795, 0x5bbf31, 407 1.1 mrg 0x48d784, 0x16df30, 0x432dc7, 0x356125, 0xce70c9, 0xb8cb30, 408 1.1 mrg 0xfd6cbf, 0xa200a4, 0xe46c05, 0xa0dd5a, 0x476f21, 0xd21262, 409 1.1 mrg 0x845cb9, 0x496170, 0xe0566b, 0x015299, 0x375550, 0xb7d51e, 410 1.1 mrg 0xc4f133, 0x5f6e13, 0xe4305d, 0xa92e85, 0xc3b21d, 0x3632a1, 411 1.1 mrg 0xa4b708, 0xd4b1ea, 0x21f716, 0xe4698f, 0x77ff27, 0x80030c, 412 1.1 mrg 0x2d408d, 0xa0cd4f, 0x99a520, 0xd3a2b3, 0x0a5d2f, 0x42f9b4, 413 1.1 mrg 0xcbda11, 0xd0be7d, 0xc1db9b, 0xbd17ab, 0x81a2ca, 0x5c6a08, 414 1.1 mrg 0x17552e, 0x550027, 0xf0147f, 0x8607e1, 0x640b14, 0x8d4196, 415 1.1 mrg 0xdebe87, 0x2afdda, 0xb6256b, 0x34897b, 0xfef305, 0x9ebfb9, 416 1.1 mrg 0x4f6a68, 0xa82a4a, 0x5ac44f, 0xbcf82d, 0x985ad7, 0x95c7f4, 417 1.1 mrg 0x8d4d0d, 0xa63a20, 0x5f57a4, 0xb13f14, 0x953880, 0x0120cc, 418 1.1 mrg 0x86dd71, 0xb6dec9, 0xf560bf, 0x11654d, 0x6b0701, 0xacb08c, 419 1.1 mrg 0xd0c0b2, 0x485551, 0x0efb1e, 0xc37295, 0x3b06a3, 0x3540c0, 420 1.1 mrg 0x7bdc06, 0xcc45e0, 0xfa294e, 0xc8cad6, 0x41f3e8, 0xde647c, 421 1.1 mrg 0xd8649b, 0x31bed9, 0xc397a4, 0xd45877, 0xc5e369, 0x13daf0, 422 1.1 mrg 0x3c3aba, 0x461846, 0x5f7555, 0xf5bdd2, 0xc6926e, 0x5d2eac, 423 1.1 mrg 0xed440e, 0x423e1c, 0x87c461, 0xe9fd29, 0xf3d6e7, 0xca7c22, 424 1.1 mrg 0x35916f, 0xc5e008, 0x8dd7ff, 0xe26a6e, 0xc6fdb0, 0xc10893, 425 1.1 mrg 0x745d7c, 0xb2ad6b, 0x9d6ecd, 0x7b723e, 0x6a11c6, 0xa9cff7, 426 1.1 mrg 0xdf7329, 0xbac9b5, 0x5100b7, 0x0db2e2, 0x24ba74, 0x607de5, 427 1.1 mrg 0x8ad874, 0x2c150d, 0x0c1881, 0x94667e, 0x162901, 0x767a9f, 428 1.1 mrg 0xbefdfd, 0xef4556, 0x367ed9, 0x13d9ec, 0xb9ba8b, 0xfc97c4, 429 1.1 mrg 0x27a831, 0xc36ef1, 0x36c594, 0x56a8d8, 0xb5a8b4, 0x0ecccf, 430 1.1 mrg 0x2d8912, 0x34576f, 0x89562c, 0xe3ce99, 0xb920d6, 0xaa5e6b, 431 1.1 mrg 0x9c2a3e, 0xcc5f11, 0x4a0bfd, 0xfbf4e1, 0x6d3b8e, 0x2c86e2, 432 1.1 mrg 0x84d4e9, 0xa9b4fc, 0xd1eeef, 0xc9352e, 0x61392f, 0x442138, 433 1.1 mrg 0xc8d91b, 0x0afc81, 0x6a4afb, 0xd81c2f, 0x84b453, 0x8c994e, 434 1.1 mrg 0xcc2254, 0xdc552a, 0xd6c6c0, 0x96190b, 0xb8701a, 0x649569, 435 1.1 mrg 0x605a26, 0xee523f, 0x0f117f, 0x11b5f4, 0xf5cbfc, 0x2dbc34, 436 1.1 mrg 0xeebc34, 0xcc5de8, 0x605edd, 0x9b8e67, 0xef3392, 0xb817c9, 437 1.1 mrg 0x9b5861, 0xbc57e1, 0xc68351, 0x103ed8, 0x4871dd, 0xdd1c2d, 438 1.1 mrg 0xa118af, 0x462c21, 0xd7f359, 0x987ad9, 0xc0549e, 0xfa864f, 439 1.1 mrg 0xfc0656, 0xae79e5, 0x362289, 0x22ad38, 0xdc9367, 0xaae855, 440 1.1 mrg 0x382682, 0x9be7ca, 0xa40d51, 0xb13399, 0x0ed7a9, 0x480569, 441 1.1 mrg 0xf0b265, 0xa7887f, 0x974c88, 0x36d1f9, 0xb39221, 0x4a827b, 442 1.1 mrg 0x21cf98, 0xdc9f40, 0x5547dc, 0x3a74e1, 0x42eb67, 0xdf9dfe, 443 1.1 mrg 0x5fd45e, 0xa4677b, 0x7aacba, 0xa2f655, 0x23882b, 0x55ba41, 444 1.1 mrg 0x086e59, 0x862a21, 0x834739, 0xe6e389, 0xd49ee5, 0x40fb49, 445 1.1 mrg 0xe956ff, 0xca0f1c, 0x8a59c5, 0x2bfa94, 0xc5c1d3, 0xcfc50f, 446 1.1 mrg 0xae5adb, 0x86c547, 0x624385, 0x3b8621, 0x94792c, 0x876110, 447 1.1 mrg 0x7b4c2a, 0x1a2c80, 0x12bf43, 0x902688, 0x893c78, 0xe4c4a8, 448 1.1 mrg 0x7bdbe5, 0xc23ac4, 0xeaf426, 0x8a67f7, 0xbf920d, 0x2ba365, 449 1.1 mrg 0xb1933d, 0x0b7cbd, 0xdc51a4, 0x63dd27, 0xdde169, 0x19949a, 450 1.1 mrg 0x9529a8, 0x28ce68, 0xb4ed09, 0x209f44, 0xca984e, 0x638270, 451 1.1 mrg 0x237c7e, 0x32b90f, 0x8ef5a7, 0xe75614, 0x08f121, 0x2a9db5, 452 1.1 mrg 0x4d7e6f, 0x5119a5, 0xabf9b5, 0xd6df82, 0x61dd96, 0x023616, 453 1.1 mrg 0x9f3ac4, 0xa1a283, 0x6ded72, 0x7a8d39, 0xa9b882, 0x5c326b, 454 1.1 mrg 0x5b2746, 0xed3400, 0x7700d2, 0x55f4fc, 0x4d5901, 0x8071e0, 455 1.1 mrg 0xe13f89, 0xb295f3, 0x64a8f1, 0xaea74b, 0x38fc4c, 0xeab2bb, 456 1.1 mrg 0x47270b, 0xabc3a7, 0x34ba60, 0x52dd34, 0xf8563a, 0xeb7e8a, 457 1.1 mrg 0x31bb36, 0x5895b7, 0x47f7a9, 0x94c3aa, 0xd39225, 0x1e7f3e, 458 1.1 mrg 0xd8974e, 0xbba94f, 0xd8ae01, 0xe661b4, 0x393d8e, 0xa523aa, 459 1.1 mrg 0x33068e, 0x1633b5, 0x3bb188, 0x1d3a9d, 0x4013d0, 0xcc1be5, 460 1.1 mrg 0xf862e7, 0x3bf28f, 0x39b5bf, 0x0bc235, 0x22747e, 0xa247c0, 461 1.1 mrg 0xd52d1f, 0x19add3, 0x9094df, 0x9311d0, 0xb42b25, 0x496db2, 462 1.1 mrg 0xe264b2, 0x5ef135, 0x3bc6a4, 0x1a4ad0, 0xaac92e, 0x64e886, 463 1.1 mrg 0x573091, 0x982cfb, 0x311b1a, 0x08728b, 0xbdcee1, 0x60e142, 464 1.1 mrg 0xeb641d, 0xd0bba3, 0xe559d4, 0x597b8c, 0x2a4483, 0xf332ba, 465 1.1 mrg 0xf84867, 0x2c8d1b, 0x2fa9b0, 0x50f3dd, 0xf9f573, 0xdb61b4, 466 1.1 mrg 0xfe233e, 0x6c41a6, 0xeea318, 0x775a26, 0xbc5e5c, 0xcea708, 467 1.1 mrg 0x94dc57, 0xe20196, 0xf1e839, 0xbe4851, 0x5d2d2f, 0x4e9555, 468 1.1 mrg 0xd96ec2, 0xe7d755, 0x6304e0, 0xc02e0e, 0xfc40a0, 0xbbf9b3, 469 1.1 mrg 0x7125a7, 0x222dfb, 0xf619d8, 0x838c1c, 0x6619e6, 0xb20d55, 470 1.1 mrg 0xbb5137, 0x79e809, 0xaf9149, 0x0d73de, 0x0b0da5, 0xce7f58, 471 1.1 mrg 0xac1934, 0x724667, 0x7a1a13, 0x9e26bc, 0x4555e7, 0x585cb5, 472 1.1 mrg 0x711d14, 0x486991, 0x480d60, 0x56adab, 0xd62f64, 0x96ee0c, 473 1.1 mrg 0x212ff3, 0x5d6d88, 0xa67684, 0x95651e, 0xab9e0a, 0x4ddefe, 474 1.1 mrg 0x571010, 0x836a39, 0xf8ea31, 0x9e381d, 0xeac8b1, 0xcac96b, 475 1.1 mrg 0x37f21e, 0xd505e9, 0x984743, 0x9fc56c, 0x0331b7, 0x3b8bf8, 476 1.1 mrg 0x86e56a, 0x8dc343, 0x6230e7, 0x93cfd5, 0x6a8f2d, 0x733005, 477 1.1 mrg 0x1af021, 0xa09fcb, 0x7415a1, 0xd56b23, 0x6ff725, 0x2f4bc7, 478 1.1 mrg 0xb8a591, 0x7fac59, 0x5c55de, 0x212c38, 0xb13296, 0x5cff50, 479 1.1 mrg 0x366262, 0xfa7b16, 0xf4d9a6, 0x2acfe7, 0xf07403, 0xd4d604, 480 1.1 mrg 0x6fd916, 0x31b1bf, 0xcbb450, 0x5bd7c8, 0x0ce194, 0x6bd643, 481 1.1 mrg 0x4fd91c, 0xdf4543, 0x5f3453, 0xe2b5aa, 0xc9aec8, 0x131485, 482 1.1 mrg 0xf9d2bf, 0xbadb9e, 0x76f5b9, 0xaf15cf, 0xca3182, 0x14b56d, 483 1.1 mrg 0xe9fe4d, 0x50fc35, 0xf5aed5, 0xa2d0c1, 0xc96057, 0x192eb6, 484 1.1 mrg 0xe91d92, 0x07d144, 0xaea3c6, 0x343566, 0x26d5b4, 0x3161e2, 485 1.1 mrg 0x37f1a2, 0x209eff, 0x958e23, 0x493798, 0x35f4a6, 0x4bdc02, 486 1.1 mrg 0xc2be13, 0xbe80a0, 0x0b72a3, 0x115c5f, 0x1e1bd1, 0x0db4d3, 487 1.1 mrg 0x869e85, 0x96976b, 0x2ac91f, 0x8a26c2, 0x3070f0, 0x041412, 488 1.1 mrg 0xfc9fa5, 0xf72a38, 0x9c6878, 0xe2aa76, 0x50cfe1, 0x559274, 489 1.1 mrg 0x934e38, 0x0a92f7, 0x5533f0, 0xa63db4, 0x399971, 0xe2b755, 490 1.1 mrg 0xa98a7c, 0x008f19, 0xac54d2, 0x2ea0b4, 0xf5f3e0, 0x60c849, 491 1.1 mrg 0xffd269, 0xae52ce, 0x7a5fdd, 0xe9ce06, 0xfb0ae8, 0xa50cce, 492 1.1 mrg 0xea9d3e, 0x3766dd, 0xb834f5, 0x0da090, 0x846f88, 0x4ae3d5, 493 1.1 mrg 0x099a03, 0x2eae2d, 0xfcb40a, 0xfb9b33, 0xe281dd, 0x1b16ba, 494 1.1 mrg 0xd8c0af, 0xd96b97, 0xb52dc9, 0x9c277f, 0x5951d5, 0x21ccd6, 495 1.1 mrg 0xb6496b, 0x584562, 0xb3baf2, 0xa1a5c4, 0x7ca2cf, 0xa9b93d, 496 1.1 mrg 0x7b7b89, 0x483d38, 497 1.1 mrg }; 498 1.1 mrg 499 1.1 mrg static const __float128 c[] = { 500 1.1 mrg /* 113 bits of pi/2 */ 501 1.1 mrg #define PI_2_1 c[0] 502 1.1 mrg 0x1.921fb54442d18469898cc51701b8p+0Q, 503 1.1 mrg 504 1.1 mrg /* pi/2 - PI_2_1 */ 505 1.1 mrg #define PI_2_1t c[1] 506 1.1 mrg 0x3.9a252049c1114cf98e804177d4c8p-116Q, 507 1.1 mrg }; 508 1.1 mrg 509 1.1 mrg 510 1.1 mrg int32_t 511 1.1 mrg __quadmath_rem_pio2q (__float128 x, __float128 *y) 512 1.1 mrg { 513 1.1 mrg __float128 z, w, t; 514 1.1 mrg double tx[8]; 515 1.1 mrg int64_t exp, n, ix, hx; 516 1.1 mrg uint64_t lx; 517 1.1 mrg 518 1.1 mrg GET_FLT128_WORDS64 (hx, lx, x); 519 1.1 mrg ix = hx & 0x7fffffffffffffffLL; 520 1.1 mrg if (ix <= 0x3ffe921fb54442d1LL) /* x in <-pi/4, pi/4> */ 521 1.1 mrg { 522 1.1 mrg y[0] = x; 523 1.1 mrg y[1] = 0; 524 1.1 mrg return 0; 525 1.1 mrg } 526 1.1 mrg 527 1.1 mrg if (ix < 0x40002d97c7f3321dLL) /* |x| in <pi/4, 3pi/4) */ 528 1.1 mrg { 529 1.1 mrg if (hx > 0) 530 1.1 mrg { 531 1.1 mrg /* 113 + 113 bit PI is ok */ 532 1.1 mrg z = x - PI_2_1; 533 1.1 mrg y[0] = z - PI_2_1t; 534 1.1 mrg y[1] = (z - y[0]) - PI_2_1t; 535 1.1 mrg return 1; 536 1.1 mrg } 537 1.1 mrg else 538 1.1 mrg { 539 1.1 mrg /* 113 + 113 bit PI is ok */ 540 1.1 mrg z = x + PI_2_1; 541 1.1 mrg y[0] = z + PI_2_1t; 542 1.1 mrg y[1] = (z - y[0]) + PI_2_1t; 543 1.1 mrg return -1; 544 1.1 mrg } 545 1.1 mrg } 546 1.1 mrg 547 1.1 mrg if (ix >= 0x7fff000000000000LL) /* x is +=oo or NaN */ 548 1.1 mrg { 549 1.1 mrg y[0] = x - x; 550 1.1 mrg y[1] = y[0]; 551 1.1 mrg return 0; 552 1.1 mrg } 553 1.1 mrg 554 1.1 mrg /* Handle large arguments. 555 1.1 mrg We split the 113 bits of the mantissa into 5 24bit integers 556 1.1 mrg stored in a double array. */ 557 1.1 mrg exp = (ix >> 48) - 16383 - 23; 558 1.1 mrg 559 1.1 mrg /* This is faster than doing this in floating point, because we 560 1.1 mrg have to convert it to integers anyway and like this we can keep 561 1.1 mrg both integer and floating point units busy. */ 562 1.1 mrg tx [0] = (double)(((ix >> 25) & 0x7fffff) | 0x800000); 563 1.1 mrg tx [1] = (double)((ix >> 1) & 0xffffff); 564 1.1 mrg tx [2] = (double)(((ix << 23) | (lx >> 41)) & 0xffffff); 565 1.1 mrg tx [3] = (double)((lx >> 17) & 0xffffff); 566 1.1 mrg tx [4] = (double)((lx << 7) & 0xffffff); 567 1.1 mrg 568 1.1 mrg n = __quadmath_kernel_rem_pio2 (tx, tx + 5, exp, 569 1.1 mrg ((lx << 7) & 0xffffff) ? 5 : 4, 570 1.1 mrg 3, two_over_pi); 571 1.1 mrg 572 1.1 mrg /* The result is now stored in 3 double values, we need to convert it into 573 1.1 mrg two __float128 values. */ 574 1.1 mrg t = (__float128) tx [6] + (__float128) tx [7]; 575 1.1 mrg w = (__float128) tx [5]; 576 1.1 mrg 577 1.1 mrg if (hx >= 0) 578 1.1 mrg { 579 1.1 mrg y[0] = w + t; 580 1.1 mrg y[1] = t - (y[0] - w); 581 1.1 mrg return n; 582 1.1 mrg } 583 1.1 mrg else 584 1.1 mrg { 585 1.1 mrg y[0] = -(w + t); 586 1.1 mrg y[1] = -t - (y[0] + w); 587 1.1 mrg return -n; 588 1.1 mrg } 589 } 590