1*25c28e83SPiotr Jasiukajtis /* 2*25c28e83SPiotr Jasiukajtis * CDDL HEADER START 3*25c28e83SPiotr Jasiukajtis * 4*25c28e83SPiotr Jasiukajtis * The contents of this file are subject to the terms of the 5*25c28e83SPiotr Jasiukajtis * Common Development and Distribution License (the "License"). 6*25c28e83SPiotr Jasiukajtis * You may not use this file except in compliance with the License. 7*25c28e83SPiotr Jasiukajtis * 8*25c28e83SPiotr Jasiukajtis * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*25c28e83SPiotr Jasiukajtis * or http://www.opensolaris.org/os/licensing. 10*25c28e83SPiotr Jasiukajtis * See the License for the specific language governing permissions 11*25c28e83SPiotr Jasiukajtis * and limitations under the License. 12*25c28e83SPiotr Jasiukajtis * 13*25c28e83SPiotr Jasiukajtis * When distributing Covered Code, include this CDDL HEADER in each 14*25c28e83SPiotr Jasiukajtis * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*25c28e83SPiotr Jasiukajtis * If applicable, add the following below this CDDL HEADER, with the 16*25c28e83SPiotr Jasiukajtis * fields enclosed by brackets "[]" replaced with your own identifying 17*25c28e83SPiotr Jasiukajtis * information: Portions Copyright [yyyy] [name of copyright owner] 18*25c28e83SPiotr Jasiukajtis * 19*25c28e83SPiotr Jasiukajtis * CDDL HEADER END 20*25c28e83SPiotr Jasiukajtis */ 21*25c28e83SPiotr Jasiukajtis /* 22*25c28e83SPiotr Jasiukajtis * Copyright 2011 Nexenta Systems, Inc. All rights reserved. 23*25c28e83SPiotr Jasiukajtis */ 24*25c28e83SPiotr Jasiukajtis /* 25*25c28e83SPiotr Jasiukajtis * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 26*25c28e83SPiotr Jasiukajtis * Use is subject to license terms. 27*25c28e83SPiotr Jasiukajtis */ 28*25c28e83SPiotr Jasiukajtis 29*25c28e83SPiotr Jasiukajtis #include "libm.h" /* __k_atan2l */ 30*25c28e83SPiotr Jasiukajtis #include "complex_wrapper.h" 31*25c28e83SPiotr Jasiukajtis 32*25c28e83SPiotr Jasiukajtis #if defined(__sparc) 33*25c28e83SPiotr Jasiukajtis #define HALF(x) ((int *) &x)[3] = 0; ((int *) &x)[2] &= 0xfe000000 34*25c28e83SPiotr Jasiukajtis #elif defined(__x86) 35*25c28e83SPiotr Jasiukajtis #define HALF(x) ((int *) &x)[0] = 0 36*25c28e83SPiotr Jasiukajtis #endif 37*25c28e83SPiotr Jasiukajtis 38*25c28e83SPiotr Jasiukajtis /* 39*25c28e83SPiotr Jasiukajtis * long double __k_atan2l(long double y, long double x, long double *e) 40*25c28e83SPiotr Jasiukajtis * 41*25c28e83SPiotr Jasiukajtis * Compute atan2l with error terms. 42*25c28e83SPiotr Jasiukajtis * 43*25c28e83SPiotr Jasiukajtis * Important formula: 44*25c28e83SPiotr Jasiukajtis * 3 5 45*25c28e83SPiotr Jasiukajtis * x x 46*25c28e83SPiotr Jasiukajtis * atan(x) = x - ----- + ----- - ... (for x <= 1) 47*25c28e83SPiotr Jasiukajtis * 3 5 48*25c28e83SPiotr Jasiukajtis * 49*25c28e83SPiotr Jasiukajtis * pi 1 1 50*25c28e83SPiotr Jasiukajtis * = --- - --- + --- - ... (for x > 1) 51*25c28e83SPiotr Jasiukajtis * 3 52*25c28e83SPiotr Jasiukajtis * 2 x 3x 53*25c28e83SPiotr Jasiukajtis * 54*25c28e83SPiotr Jasiukajtis * Arg(x + y i) = sign(y) * atan2(|y|, x) 55*25c28e83SPiotr Jasiukajtis * = sign(y) * atan(|y|/x) (for x > 0) 56*25c28e83SPiotr Jasiukajtis * sign(y) * (PI - atan(|y|/|x|)) (for x < 0) 57*25c28e83SPiotr Jasiukajtis * Thus if x >> y (IEEE double: EXP(x) - EXP(y) >= 60): 58*25c28e83SPiotr Jasiukajtis * 1. (x > 0): atan2(y,x) ~ y/x 59*25c28e83SPiotr Jasiukajtis * 2. (x < 0): atan2(y,x) ~ sign(y) (PI - |y/x|)) 60*25c28e83SPiotr Jasiukajtis * Otherwise if x << y: 61*25c28e83SPiotr Jasiukajtis * atan2(y,x) ~ sign(y)*PI/2 - x/y 62*25c28e83SPiotr Jasiukajtis * 63*25c28e83SPiotr Jasiukajtis * __k_atan2l call static functions mx_polyl, mx_atanl 64*25c28e83SPiotr Jasiukajtis */ 65*25c28e83SPiotr Jasiukajtis 66*25c28e83SPiotr Jasiukajtis 67*25c28e83SPiotr Jasiukajtis /* 68*25c28e83SPiotr Jasiukajtis * (void) mx_polyl (long double *z, long double *a, long double *e, int n) 69*25c28e83SPiotr Jasiukajtis * return 70*25c28e83SPiotr Jasiukajtis * e = a + z*(a + z*(a + ... z*(a + e)...)) 71*25c28e83SPiotr Jasiukajtis * 0 2 4 2n 72*25c28e83SPiotr Jasiukajtis * Note: 73*25c28e83SPiotr Jasiukajtis * 1. e and coefficient ai are represented by two long double numbers. 74*25c28e83SPiotr Jasiukajtis * For e, the first one contain the leading 53 bits (30 for x86 exteneded) 75*25c28e83SPiotr Jasiukajtis * and the second one contain the remaining 113 bits (64 for x86 extended). 76*25c28e83SPiotr Jasiukajtis * For ai, the first one contian the leading 53 bits (or 30 for x86) 77*25c28e83SPiotr Jasiukajtis * rounded, and the second is the remaining 113 bits (or 64 for x86). 78*25c28e83SPiotr Jasiukajtis * 2. z is an array of three doubles. 79*25c28e83SPiotr Jasiukajtis * z[0] : the rounded value of Z (the intended value of z) 80*25c28e83SPiotr Jasiukajtis * z[1] : the leading 32 (or 56) bits of Z rounded 81*25c28e83SPiotr Jasiukajtis * z[2] : the remaining 113 (or 64) bits of Z 82*25c28e83SPiotr Jasiukajtis * Note that z[0] = z[1]+z[2] rounded. 83*25c28e83SPiotr Jasiukajtis * 84*25c28e83SPiotr Jasiukajtis */ 85*25c28e83SPiotr Jasiukajtis 86*25c28e83SPiotr Jasiukajtis static void 87*25c28e83SPiotr Jasiukajtis mx_polyl(const long double *z, const long double *a, long double *e, int n) { 88*25c28e83SPiotr Jasiukajtis long double r, s, t, p_h, p_l, z_h, z_l, p, w; 89*25c28e83SPiotr Jasiukajtis int i; 90*25c28e83SPiotr Jasiukajtis n = n + n; 91*25c28e83SPiotr Jasiukajtis p = e[0] + a[n]; 92*25c28e83SPiotr Jasiukajtis p_l = a[n + 1]; 93*25c28e83SPiotr Jasiukajtis w = p; HALF(w); 94*25c28e83SPiotr Jasiukajtis p_h = w; 95*25c28e83SPiotr Jasiukajtis p = a[n - 2] + z[0] * p; 96*25c28e83SPiotr Jasiukajtis z_h = z[1]; z_l = z[2]; 97*25c28e83SPiotr Jasiukajtis p_l += e[0] - (p_h - a[n]); 98*25c28e83SPiotr Jasiukajtis 99*25c28e83SPiotr Jasiukajtis for (i = n - 2; i >= 2; i -= 2) { 100*25c28e83SPiotr Jasiukajtis 101*25c28e83SPiotr Jasiukajtis /* compute p = ai + z * p */ 102*25c28e83SPiotr Jasiukajtis t = z_h * p_h; 103*25c28e83SPiotr Jasiukajtis s = z[0] * p_l + p_h * z_l; 104*25c28e83SPiotr Jasiukajtis w = p; HALF(w); 105*25c28e83SPiotr Jasiukajtis p_h = w; 106*25c28e83SPiotr Jasiukajtis s += a[i + 1]; 107*25c28e83SPiotr Jasiukajtis r = t - (p_h - a[i]); 108*25c28e83SPiotr Jasiukajtis p = a[i - 2] + z[0] * p; 109*25c28e83SPiotr Jasiukajtis p_l = r + s; 110*25c28e83SPiotr Jasiukajtis } 111*25c28e83SPiotr Jasiukajtis w = p; HALF(w); 112*25c28e83SPiotr Jasiukajtis e[0] = w; 113*25c28e83SPiotr Jasiukajtis t = z_h * p_h; 114*25c28e83SPiotr Jasiukajtis s = z[0] * p_l + p_h * z_l; 115*25c28e83SPiotr Jasiukajtis r = t - (e[0] - a[0]); 116*25c28e83SPiotr Jasiukajtis e[1] = r + s; 117*25c28e83SPiotr Jasiukajtis } 118*25c28e83SPiotr Jasiukajtis 119*25c28e83SPiotr Jasiukajtis /* 120*25c28e83SPiotr Jasiukajtis * Table of constants for atan from 0.125 to 8 121*25c28e83SPiotr Jasiukajtis * 0.125 -- 0x3ffc0000 --- (increment at bit 12) 122*25c28e83SPiotr Jasiukajtis * 0x3ffc1000 123*25c28e83SPiotr Jasiukajtis * 0x3ffc2000 124*25c28e83SPiotr Jasiukajtis * ... ... 125*25c28e83SPiotr Jasiukajtis * 0x4001f000 126*25c28e83SPiotr Jasiukajtis * 8.000 -- 0x40020000 (total: 97) 127*25c28e83SPiotr Jasiukajtis */ 128*25c28e83SPiotr Jasiukajtis 129*25c28e83SPiotr Jasiukajtis static const long double TBL_atan_hil[] = { 130*25c28e83SPiotr Jasiukajtis #if defined(__sparc) 131*25c28e83SPiotr Jasiukajtis 1.2435499454676143503135484916387102416568e-01L, 132*25c28e83SPiotr Jasiukajtis 1.3203976161463874927468440652656953226250e-01L, 133*25c28e83SPiotr Jasiukajtis 1.3970887428916364518336777673909505681607e-01L, 134*25c28e83SPiotr Jasiukajtis 1.4736148108865163560980276039684551821066e-01L, 135*25c28e83SPiotr Jasiukajtis 1.5499674192394098230371437493349219133371e-01L, 136*25c28e83SPiotr Jasiukajtis 1.6261382859794857537364156376155780062019e-01L, 137*25c28e83SPiotr Jasiukajtis 1.7021192528547440449049660709976171369543e-01L, 138*25c28e83SPiotr Jasiukajtis 1.7779022899267607079662479921582468899456e-01L, 139*25c28e83SPiotr Jasiukajtis 1.8534794999569476488602596122854464667261e-01L, 140*25c28e83SPiotr Jasiukajtis 1.9288431225797466419705871069022730349878e-01L, 141*25c28e83SPiotr Jasiukajtis 2.0039855382587851465394578503437838446153e-01L, 142*25c28e83SPiotr Jasiukajtis 2.0788992720226299360533498310299432475629e-01L, 143*25c28e83SPiotr Jasiukajtis 2.1535769969773804802445962716648964165745e-01L, 144*25c28e83SPiotr Jasiukajtis 2.2280115375939451577103212214043255525024e-01L, 145*25c28e83SPiotr Jasiukajtis 2.3021958727684373024017095967980299065551e-01L, 146*25c28e83SPiotr Jasiukajtis 2.3761231386547125247388363432563777919892e-01L, 147*25c28e83SPiotr Jasiukajtis 2.4497866312686415417208248121127580641959e-01L, 148*25c28e83SPiotr Jasiukajtis 2.5962962940825753102994644318397190560106e-01L, 149*25c28e83SPiotr Jasiukajtis 2.7416745111965879759937189834217578592444e-01L, 150*25c28e83SPiotr Jasiukajtis 2.8858736189407739562361141995821834504332e-01L, 151*25c28e83SPiotr Jasiukajtis 3.0288486837497140556055609450555821812277e-01L, 152*25c28e83SPiotr Jasiukajtis 3.1705575320914700980901557667446732975852e-01L, 153*25c28e83SPiotr Jasiukajtis 3.3109607670413209494433878775694455421259e-01L, 154*25c28e83SPiotr Jasiukajtis 3.4500217720710510886768128690005168408290e-01L, 155*25c28e83SPiotr Jasiukajtis 3.5877067027057222039592006392646052215363e-01L, 156*25c28e83SPiotr Jasiukajtis 3.7239844667675422192365503828370182641413e-01L, 157*25c28e83SPiotr Jasiukajtis 3.8588266939807377589769548460723139638186e-01L, 158*25c28e83SPiotr Jasiukajtis 3.9922076957525256561471669615886476491104e-01L, 159*25c28e83SPiotr Jasiukajtis 4.1241044159738730689979128966712694260920e-01L, 160*25c28e83SPiotr Jasiukajtis 4.2544963737004228954226360518079233013817e-01L, 161*25c28e83SPiotr Jasiukajtis 4.3833655985795780544561604921477130895882e-01L, 162*25c28e83SPiotr Jasiukajtis 4.5106965598852347637563925728219344073798e-01L, 163*25c28e83SPiotr Jasiukajtis 4.6364760900080611621425623146121439713344e-01L, 164*25c28e83SPiotr Jasiukajtis 4.8833395105640552386716496074706484459644e-01L, 165*25c28e83SPiotr Jasiukajtis 5.1238946031073770666660102058425923805558e-01L, 166*25c28e83SPiotr Jasiukajtis 5.3581123796046370026908506870769144698471e-01L, 167*25c28e83SPiotr Jasiukajtis 5.5859931534356243597150821640166122875873e-01L, 168*25c28e83SPiotr Jasiukajtis 5.8075635356767039920327447500150082375122e-01L, 169*25c28e83SPiotr Jasiukajtis 6.0228734613496418168212269420423291922459e-01L, 170*25c28e83SPiotr Jasiukajtis 6.2319932993406593099247534906037459367793e-01L, 171*25c28e83SPiotr Jasiukajtis 6.4350110879328438680280922871732260447265e-01L, 172*25c28e83SPiotr Jasiukajtis 6.6320299270609325536325431023827583417226e-01L, 173*25c28e83SPiotr Jasiukajtis 6.8231655487474807825642998171115298784729e-01L, 174*25c28e83SPiotr Jasiukajtis 7.0085440788445017245795128178675127318623e-01L, 175*25c28e83SPiotr Jasiukajtis 7.1882999962162450541701415152590469891043e-01L, 176*25c28e83SPiotr Jasiukajtis 7.3625742898142813174283527108914662479274e-01L, 177*25c28e83SPiotr Jasiukajtis 7.5315128096219438952473937026902888600575e-01L, 178*25c28e83SPiotr Jasiukajtis 7.6952648040565826040682003598565401726598e-01L, 179*25c28e83SPiotr Jasiukajtis 7.8539816339744830961566084581987569936977e-01L, 180*25c28e83SPiotr Jasiukajtis 8.1569192331622341102146083874564582672284e-01L, 181*25c28e83SPiotr Jasiukajtis 8.4415398611317100251784414827164746738632e-01L, 182*25c28e83SPiotr Jasiukajtis 8.7090345707565295314017311259781407291650e-01L, 183*25c28e83SPiotr Jasiukajtis 8.9605538457134395617480071802993779546602e-01L, 184*25c28e83SPiotr Jasiukajtis 9.1971960535041681722860345482108940969311e-01L, 185*25c28e83SPiotr Jasiukajtis 9.4200004037946366473793717053459362115891e-01L, 186*25c28e83SPiotr Jasiukajtis 9.6299433068093620181519583599709989677298e-01L, 187*25c28e83SPiotr Jasiukajtis 9.8279372324732906798571061101466603762572e-01L, 188*25c28e83SPiotr Jasiukajtis 1.0014831356942347329183295953014374896343e+00L, 189*25c28e83SPiotr Jasiukajtis 1.0191413442663497346383429170230636212354e+00L, 190*25c28e83SPiotr Jasiukajtis 1.0358412530088001765846944703254440735476e+00L, 191*25c28e83SPiotr Jasiukajtis 1.0516502125483736674598673120862999026920e+00L, 192*25c28e83SPiotr Jasiukajtis 1.0666303653157435630791763474202799086015e+00L, 193*25c28e83SPiotr Jasiukajtis 1.0808390005411683108871567292171997859003e+00L, 194*25c28e83SPiotr Jasiukajtis 1.0943289073211899198927883146102352763033e+00L, 195*25c28e83SPiotr Jasiukajtis 1.1071487177940905030170654601785370497543e+00L, 196*25c28e83SPiotr Jasiukajtis 1.1309537439791604464709335155363277560026e+00L, 197*25c28e83SPiotr Jasiukajtis 1.1525719972156675180401498626127514672834e+00L, 198*25c28e83SPiotr Jasiukajtis 1.1722738811284763866005949441337046006865e+00L, 199*25c28e83SPiotr Jasiukajtis 1.1902899496825317329277337748293182803384e+00L, 200*25c28e83SPiotr Jasiukajtis 1.2068173702852525303955115800565576625682e+00L, 201*25c28e83SPiotr Jasiukajtis 1.2220253232109896370417417439225704120294e+00L, 202*25c28e83SPiotr Jasiukajtis 1.2360594894780819419094519711090786146210e+00L, 203*25c28e83SPiotr Jasiukajtis 1.2490457723982544258299170772810900483550e+00L, 204*25c28e83SPiotr Jasiukajtis 1.2610933822524404193139408812473357640124e+00L, 205*25c28e83SPiotr Jasiukajtis 1.2722973952087173412961937498224805746463e+00L, 206*25c28e83SPiotr Jasiukajtis 1.2827408797442707473628852511364955164072e+00L, 207*25c28e83SPiotr Jasiukajtis 1.2924966677897852679030914214070816723528e+00L, 208*25c28e83SPiotr Jasiukajtis 1.3016288340091961438047858503666855024453e+00L, 209*25c28e83SPiotr Jasiukajtis 1.3101939350475556342564376891719053437537e+00L, 210*25c28e83SPiotr Jasiukajtis 1.3182420510168370498593302023271363040427e+00L, 211*25c28e83SPiotr Jasiukajtis 1.3258176636680324650592392104284756886164e+00L, 212*25c28e83SPiotr Jasiukajtis 1.3397056595989995393283037525895557850243e+00L, 213*25c28e83SPiotr Jasiukajtis 1.3521273809209546571891479413898127598774e+00L, 214*25c28e83SPiotr Jasiukajtis 1.3633001003596939542892985278250991560269e+00L, 215*25c28e83SPiotr Jasiukajtis 1.3734007669450158608612719264449610604836e+00L, 216*25c28e83SPiotr Jasiukajtis 1.3825748214901258580599674177685685163955e+00L, 217*25c28e83SPiotr Jasiukajtis 1.3909428270024183486427686943836432395486e+00L, 218*25c28e83SPiotr Jasiukajtis 1.3986055122719575950126700816114282727858e+00L, 219*25c28e83SPiotr Jasiukajtis 1.4056476493802697809521934019958080664406e+00L, 220*25c28e83SPiotr Jasiukajtis 1.4121410646084952153676136718584890852820e+00L, 221*25c28e83SPiotr Jasiukajtis 1.4181469983996314594038603039700988632607e+00L, 222*25c28e83SPiotr Jasiukajtis 1.4237179714064941189018190466107297108905e+00L, 223*25c28e83SPiotr Jasiukajtis 1.4288992721907326964184700745371984001389e+00L, 224*25c28e83SPiotr Jasiukajtis 1.4337301524847089866404719096698873880264e+00L, 225*25c28e83SPiotr Jasiukajtis 1.4382447944982225979614042479354816039669e+00L, 226*25c28e83SPiotr Jasiukajtis 1.4424730991091018200252920599377291810352e+00L, 227*25c28e83SPiotr Jasiukajtis 1.4464413322481351841999668424758803866109e+00L, 228*25c28e83SPiotr Jasiukajtis #elif defined(__x86) 229*25c28e83SPiotr Jasiukajtis 1.243549945356789976358413696289e-01L, 1.320397615781985223293304443359e-01L, 230*25c28e83SPiotr Jasiukajtis 1.397088742814958095550537109375e-01L, 1.473614810383878648281097412109e-01L, 231*25c28e83SPiotr Jasiukajtis 1.549967419123277068138122558594e-01L, 1.626138285500928759574890136719e-01L, 232*25c28e83SPiotr Jasiukajtis 1.702119252295233309268951416016e-01L, 1.777902289759367704391479492188e-01L, 233*25c28e83SPiotr Jasiukajtis 1.853479499695822596549987792969e-01L, 1.928843122441321611404418945312e-01L, 234*25c28e83SPiotr Jasiukajtis 2.003985538030974566936492919922e-01L, 2.078899272019043564796447753906e-01L, 235*25c28e83SPiotr Jasiukajtis 2.153576996643096208572387695312e-01L, 2.228011537226848304271697998047e-01L, 236*25c28e83SPiotr Jasiukajtis 2.302195872762240469455718994141e-01L, 2.376123138237744569778442382812e-01L, 237*25c28e83SPiotr Jasiukajtis 2.449786631041206419467926025391e-01L, 2.596296293195337057113647460938e-01L, 238*25c28e83SPiotr Jasiukajtis 2.741674510762095451354980468750e-01L, 2.885873618070036172866821289062e-01L, 239*25c28e83SPiotr Jasiukajtis 3.028848683461546897888183593750e-01L, 3.170557531993836164474487304688e-01L, 240*25c28e83SPiotr Jasiukajtis 3.310960766393691301345825195312e-01L, 3.450021771714091300964355468750e-01L, 241*25c28e83SPiotr Jasiukajtis 3.587706702528521418571472167969e-01L, 3.723984466632828116416931152344e-01L, 242*25c28e83SPiotr Jasiukajtis 3.858826693613082170486450195312e-01L, 3.992207695264369249343872070312e-01L, 243*25c28e83SPiotr Jasiukajtis 4.124104415532201528549194335938e-01L, 4.254496373469009995460510253906e-01L, 244*25c28e83SPiotr Jasiukajtis 4.383365598041564226150512695312e-01L, 4.510696559445932507514953613281e-01L, 245*25c28e83SPiotr Jasiukajtis 4.636476089945062994956970214844e-01L, 4.883339509833604097366333007812e-01L, 246*25c28e83SPiotr Jasiukajtis 5.123894601128995418548583984375e-01L, 5.358112377580255270004272460938e-01L, 247*25c28e83SPiotr Jasiukajtis 5.585993151180446147918701171875e-01L, 5.807563534472137689590454101562e-01L, 248*25c28e83SPiotr Jasiukajtis 6.022873460315167903900146484375e-01L, 6.231993297114968299865722656250e-01L, 249*25c28e83SPiotr Jasiukajtis 6.435011087451130151748657226562e-01L, 6.632029926404356956481933593750e-01L, 250*25c28e83SPiotr Jasiukajtis 6.823165547102689743041992187500e-01L, 7.008544078562408685684204101562e-01L, 251*25c28e83SPiotr Jasiukajtis 7.188299994450062513351440429688e-01L, 7.362574287690222263336181640625e-01L, 252*25c28e83SPiotr Jasiukajtis 7.531512808054685592651367187500e-01L, 7.695264802314341068267822265625e-01L, 253*25c28e83SPiotr Jasiukajtis 7.853981633670628070831298828125e-01L, 8.156919232569634914398193359375e-01L, 254*25c28e83SPiotr Jasiukajtis 8.441539860796183347702026367188e-01L, 8.709034570492804050445556640625e-01L, 255*25c28e83SPiotr Jasiukajtis 8.960553845390677452087402343750e-01L, 9.197196052409708499908447265625e-01L, 256*25c28e83SPiotr Jasiukajtis 9.420000403188169002532958984375e-01L, 9.629943305626511573791503906250e-01L, 257*25c28e83SPiotr Jasiukajtis 9.827937232330441474914550781250e-01L, 1.001483135391026735305786132812e+00L, 258*25c28e83SPiotr Jasiukajtis 1.019141343887895345687866210938e+00L, 1.035841252654790878295898437500e+00L, 259*25c28e83SPiotr Jasiukajtis 1.051650212146341800689697265625e+00L, 1.066630364861339330673217773438e+00L, 260*25c28e83SPiotr Jasiukajtis 1.080839000176638364791870117188e+00L, 1.094328907318413257598876953125e+00L, 261*25c28e83SPiotr Jasiukajtis 1.107148717623203992843627929688e+00L, 1.130953743588179349899291992188e+00L, 262*25c28e83SPiotr Jasiukajtis 1.152571997139602899551391601562e+00L, 1.172273880802094936370849609375e+00L, 263*25c28e83SPiotr Jasiukajtis 1.190289949532598257064819335938e+00L, 1.206817369908094406127929687500e+00L, 264*25c28e83SPiotr Jasiukajtis 1.222025323193520307540893554688e+00L, 1.236059489194303750991821289062e+00L, 265*25c28e83SPiotr Jasiukajtis 1.249045772012323141098022460938e+00L, 1.261093381792306900024414062500e+00L, 266*25c28e83SPiotr Jasiukajtis 1.272297394927591085433959960938e+00L, 1.282740879338234663009643554688e+00L, 267*25c28e83SPiotr Jasiukajtis 1.292496667709201574325561523438e+00L, 1.301628833636641502380371093750e+00L, 268*25c28e83SPiotr Jasiukajtis 1.310193934943526983261108398438e+00L, 1.318242050707340240478515625000e+00L, 269*25c28e83SPiotr Jasiukajtis 1.325817663222551345825195312500e+00L, 1.339705659542232751846313476562e+00L, 270*25c28e83SPiotr Jasiukajtis 1.352127380669116973876953125000e+00L, 1.363300099968910217285156250000e+00L, 271*25c28e83SPiotr Jasiukajtis 1.373400766868144273757934570312e+00L, 1.382574821356683969497680664062e+00L, 272*25c28e83SPiotr Jasiukajtis 1.390942826867103576660156250000e+00L, 1.398605511989444494247436523438e+00L, 273*25c28e83SPiotr Jasiukajtis 1.405647648964077234268188476562e+00L, 1.412141064181923866271972656250e+00L, 274*25c28e83SPiotr Jasiukajtis 1.418146998155862092971801757812e+00L, 1.423717970959842205047607421875e+00L, 275*25c28e83SPiotr Jasiukajtis 1.428899271879345178604125976562e+00L, 1.433730152435600757598876953125e+00L, 276*25c28e83SPiotr Jasiukajtis 1.438244794495403766632080078125e+00L, 1.442473099101334810256958007812e+00L, 277*25c28e83SPiotr Jasiukajtis 1.446441331878304481506347656250e+00L, 278*25c28e83SPiotr Jasiukajtis #endif 279*25c28e83SPiotr Jasiukajtis }; 280*25c28e83SPiotr Jasiukajtis static const long double TBL_atan_lol[] = { 281*25c28e83SPiotr Jasiukajtis #if defined(__sparc) 282*25c28e83SPiotr Jasiukajtis 1.4074869197628063802317202820414310039556e-36L, 283*25c28e83SPiotr Jasiukajtis -4.9596961594739925555730439437999675295505e-36L, 284*25c28e83SPiotr Jasiukajtis 8.9527745625194648873931213446361849472788e-36L, 285*25c28e83SPiotr Jasiukajtis 1.1880437423207895718180765843544965589427e-35L, 286*25c28e83SPiotr Jasiukajtis -2.7810278112045145378425375128234365381448e-37L, 287*25c28e83SPiotr Jasiukajtis 1.4797220377023800327295536234315147262387e-36L, 288*25c28e83SPiotr Jasiukajtis -4.2169561400548198732870384801849639863829e-36L, 289*25c28e83SPiotr Jasiukajtis 7.2431229666913484649930323656316023494680e-36L, 290*25c28e83SPiotr Jasiukajtis -2.1573430089839170299895679353790663182462e-36L, 291*25c28e83SPiotr Jasiukajtis -9.9515745405126723554452367298128605186305e-36L, 292*25c28e83SPiotr Jasiukajtis -3.9065558992324838181617569730397882363067e-36L, 293*25c28e83SPiotr Jasiukajtis 5.5260292271793726813211980664661124518807e-36L, 294*25c28e83SPiotr Jasiukajtis 8.8415722215914321807682254318036452043689e-36L, 295*25c28e83SPiotr Jasiukajtis -8.1767728791586179254193323628285599800711e-36L, 296*25c28e83SPiotr Jasiukajtis -1.3344123034656142243797113823028330070762e-36L, 297*25c28e83SPiotr Jasiukajtis -4.4927331207813382908930733924681325892188e-36L, 298*25c28e83SPiotr Jasiukajtis 4.4945511471812490393201824336762495687730e-36L, 299*25c28e83SPiotr Jasiukajtis -1.6688081504279223555776724459648440567274e-35L, 300*25c28e83SPiotr Jasiukajtis 1.5629757586107955769461086568937329684113e-35L, 301*25c28e83SPiotr Jasiukajtis -2.2389835563308078552507970385331510848109e-35L, 302*25c28e83SPiotr Jasiukajtis -4.8312321745547311551870450671182151367050e-36L, 303*25c28e83SPiotr Jasiukajtis -1.4336172352905832876958926610980698844309e-35L, 304*25c28e83SPiotr Jasiukajtis -8.7440181998899932802989174170960593316080e-36L, 305*25c28e83SPiotr Jasiukajtis 5.9284636008529837445780360785464550143016e-36L, 306*25c28e83SPiotr Jasiukajtis -2.2376651248436241276061055295043514993630e-35L, 307*25c28e83SPiotr Jasiukajtis 6.0745837599336105414280310756677442136480e-36L, 308*25c28e83SPiotr Jasiukajtis 1.5372187110451949677792344762029967023093e-35L, 309*25c28e83SPiotr Jasiukajtis 2.0976068056751156241657121582478790247159e-35L, 310*25c28e83SPiotr Jasiukajtis -5.5623956405495438060726862202622807523700e-36L, 311*25c28e83SPiotr Jasiukajtis 1.9697366707832471841858411934897351901523e-35L, 312*25c28e83SPiotr Jasiukajtis 2.1070311964479488509034733639424887543697e-35L, 313*25c28e83SPiotr Jasiukajtis -2.3027356362982001602256518510854229844561e-35L, 314*25c28e83SPiotr Jasiukajtis 4.8950964225733349266861843522029764772843e-36L, 315*25c28e83SPiotr Jasiukajtis -7.2380143477794458213872723050820253166391e-36L, 316*25c28e83SPiotr Jasiukajtis 1.6365648865703614031637443396049568858105e-35L, 317*25c28e83SPiotr Jasiukajtis -3.9885811958234530793729129919803234197399e-35L, 318*25c28e83SPiotr Jasiukajtis 4.1587722120912613510417783923227421336929e-35L, 319*25c28e83SPiotr Jasiukajtis 3.8347421454556472153684687377337135027394e-35L, 320*25c28e83SPiotr Jasiukajtis -9.2251178933638721723515896465489002497864e-36L, 321*25c28e83SPiotr Jasiukajtis 1.4094619690455989526175736741854656192178e-36L, 322*25c28e83SPiotr Jasiukajtis 3.3568857805472235270612851425810803679451e-35L, 323*25c28e83SPiotr Jasiukajtis 3.9090991055522552395018106803232118803401e-35L, 324*25c28e83SPiotr Jasiukajtis 5.2956416979654208140521862707297033857956e-36L, 325*25c28e83SPiotr Jasiukajtis -5.0960846819945514367847063923662507136721e-36L, 326*25c28e83SPiotr Jasiukajtis -4.4959014425277615858329680393918315204998e-35L, 327*25c28e83SPiotr Jasiukajtis 3.8039226544551634266566857615962609653834e-35L, 328*25c28e83SPiotr Jasiukajtis -4.4056522872895512108308642196611689657618e-36L, 329*25c28e83SPiotr Jasiukajtis 1.6025024192482161076223807753425619076948e-36L, 330*25c28e83SPiotr Jasiukajtis 2.1679525325309452561992610065108380635264e-35L, 331*25c28e83SPiotr Jasiukajtis 1.9844038013515422125715362925736754104066e-35L, 332*25c28e83SPiotr Jasiukajtis 3.9139619471799746834505227353568432457241e-35L, 333*25c28e83SPiotr Jasiukajtis 2.1113443807975453505518453436799561854730e-35L, 334*25c28e83SPiotr Jasiukajtis 3.1558557277444692755039816944392770185432e-35L, 335*25c28e83SPiotr Jasiukajtis 1.6295044520355461408265585619500238335614e-35L, 336*25c28e83SPiotr Jasiukajtis -3.5087245209270305856151230356171213582305e-35L, 337*25c28e83SPiotr Jasiukajtis 2.9041041864282855679591055270946117300088e-35L, 338*25c28e83SPiotr Jasiukajtis -2.3128843453818356590931995209806627233282e-35L, 339*25c28e83SPiotr Jasiukajtis -7.7124923181471578439967973820714857839953e-35L, 340*25c28e83SPiotr Jasiukajtis 2.7539027829886922429092063590445808781462e-35L, 341*25c28e83SPiotr Jasiukajtis -9.4500899453181308951084545990839335972452e-35L, 342*25c28e83SPiotr Jasiukajtis -7.3061755302032092337594946001641651543473e-35L, 343*25c28e83SPiotr Jasiukajtis -4.1736144813953752193952770157406952602798e-35L, 344*25c28e83SPiotr Jasiukajtis 3.4369948356256407045344855262863733571105e-35L, 345*25c28e83SPiotr Jasiukajtis -6.3790243492298090907302084924276831116460e-35L, 346*25c28e83SPiotr Jasiukajtis -9.6842943816353261291004127866079538980649e-36L, 347*25c28e83SPiotr Jasiukajtis 4.8746757539138870909275958326700072821615e-35L, 348*25c28e83SPiotr Jasiukajtis -8.7533886477084190884511601368582548254655e-35L, 349*25c28e83SPiotr Jasiukajtis 1.4284743992327918892692551138086727754845e-35L, 350*25c28e83SPiotr Jasiukajtis 5.7262776211073389542565625693479173445042e-35L, 351*25c28e83SPiotr Jasiukajtis -3.2254883148780411245594822270747948565684e-35L, 352*25c28e83SPiotr Jasiukajtis 7.8853548190609877325965525252380833808405e-35L, 353*25c28e83SPiotr Jasiukajtis 8.4081736739037194097515038365370730251333e-35L, 354*25c28e83SPiotr Jasiukajtis 7.4722870357563683815078242981933587273670e-35L, 355*25c28e83SPiotr Jasiukajtis 7.9977202825793435289434813600890494256112e-36L, 356*25c28e83SPiotr Jasiukajtis -8.0577840773362139054848492346292673645405e-35L, 357*25c28e83SPiotr Jasiukajtis 1.4217746753670583065490040209048757624336e-35L, 358*25c28e83SPiotr Jasiukajtis 1.2232486914221205004109743560319090913328e-35L, 359*25c28e83SPiotr Jasiukajtis 8.9696055070830036447361957217943988339065e-35L, 360*25c28e83SPiotr Jasiukajtis -3.1480394435081884410686066739846269858951e-35L, 361*25c28e83SPiotr Jasiukajtis -5.0927146040715345013240642517608928352977e-35L, 362*25c28e83SPiotr Jasiukajtis -5.7431997715924136568133859432702789493569e-35L, 363*25c28e83SPiotr Jasiukajtis -4.3920451405083770279099766080476485439987e-35L, 364*25c28e83SPiotr Jasiukajtis 9.1106753984907715563018666776308759323326e-35L, 365*25c28e83SPiotr Jasiukajtis -3.7032569014272841009512400773061537538358e-35L, 366*25c28e83SPiotr Jasiukajtis 8.8167419429746714276909825405131416764489e-35L, 367*25c28e83SPiotr Jasiukajtis -3.8389341696028352503752312861740895209678e-36L, 368*25c28e83SPiotr Jasiukajtis -3.3462959341960891546340895508017603408404e-35L, 369*25c28e83SPiotr Jasiukajtis -3.9212626776786074383916188498955828634947e-35L, 370*25c28e83SPiotr Jasiukajtis -7.8340397396377867255864494568594088378648e-35L, 371*25c28e83SPiotr Jasiukajtis 7.4681018632456986520600640340627309824469e-35L, 372*25c28e83SPiotr Jasiukajtis 8.9110918618956918451135594876165314884113e-35L, 373*25c28e83SPiotr Jasiukajtis 3.9418160632271890530431797145664308529115e-35L, 374*25c28e83SPiotr Jasiukajtis -4.1048114088580104820193435638327617443913e-35L, 375*25c28e83SPiotr Jasiukajtis -2.3165419451582153326383944756220900454330e-35L, 376*25c28e83SPiotr Jasiukajtis -1.8428312581525319409399330203703211113843e-35L, 377*25c28e83SPiotr Jasiukajtis 7.1477316546709482345411712017906842769961e-35L, 378*25c28e83SPiotr Jasiukajtis 2.9914501578435874662153637707016094237004e-35L, 379*25c28e83SPiotr Jasiukajtis #elif defined(__x86) 380*25c28e83SPiotr Jasiukajtis 1.108243739551347953496477557317e-11L, 3.644022694535396219063202730280e-11L, 381*25c28e83SPiotr Jasiukajtis 7.667835628314065801595065768845e-12L, 5.026377078169301918590803009109e-11L, 382*25c28e83SPiotr Jasiukajtis 1.161327548990211907411719105561e-11L, 4.785569941615255008968280209991e-11L, 383*25c28e83SPiotr Jasiukajtis 5.595107356360146549819920947848e-11L, 1.673930035747684999707469623769e-11L, 384*25c28e83SPiotr Jasiukajtis 2.611250523102718193166964451527e-11L, 1.384250305661681615897729354721e-11L, 385*25c28e83SPiotr Jasiukajtis 2.278105796029649304219088055497e-11L, 3.586371256902077123693302823191e-13L, 386*25c28e83SPiotr Jasiukajtis 3.342842716722085763523965049902e-11L, 3.670968534386232233574504707347e-11L, 387*25c28e83SPiotr Jasiukajtis 6.196832945990602657404893210974e-13L, 4.169679549603939604438777470618e-11L, 388*25c28e83SPiotr Jasiukajtis 2.274351222528987867221331091414e-11L, 8.872382531858169709022188891298e-11L, 389*25c28e83SPiotr Jasiukajtis 4.344925246387385146717580155420e-11L, 8.707377833692929105196832265348e-11L, 390*25c28e83SPiotr Jasiukajtis 2.881671577173773513055821329154e-11L, 9.763393361566846205717315422347e-12L, 391*25c28e83SPiotr Jasiukajtis 6.476296480975626822569454546857e-11L, 3.569597877124574002505169001136e-11L, 392*25c28e83SPiotr Jasiukajtis 1.772007853877284712958549977698e-11L, 1.347141028196192304932683248872e-11L, 393*25c28e83SPiotr Jasiukajtis 3.676555884905046507598141175404e-11L, 4.881564068032948912761478588710e-11L, 394*25c28e83SPiotr Jasiukajtis 4.416715404487185607337693704681e-11L, 2.314128999621257979016734983553e-11L, 395*25c28e83SPiotr Jasiukajtis 5.380138283056477968352133002913e-11L, 4.393022562414389595406841771063e-11L, 396*25c28e83SPiotr Jasiukajtis 6.299816718559209976839402028537e-12L, 7.304511413053165996581483735843e-11L, 397*25c28e83SPiotr Jasiukajtis 1.978381648117426221467592544212e-10L, 2.024381732686578226139414070989e-10L, 398*25c28e83SPiotr Jasiukajtis 2.255178211796380992141612703464e-10L, 1.204566302442290648452508620986e-10L, 399*25c28e83SPiotr Jasiukajtis 1.034473912921080457667329099995e-10L, 2.225691010059030834353745950874e-10L, 400*25c28e83SPiotr Jasiukajtis 4.817137162794350606107263804151e-11L, 6.565755971506095086327587326326e-11L, 401*25c28e83SPiotr Jasiukajtis 1.644791039522307629611529931429e-10L, 2.820930388953087163050126809014e-11L, 402*25c28e83SPiotr Jasiukajtis 1.766182540818701085571546539514e-10L, 2.124059054092171070266466628320e-10L, 403*25c28e83SPiotr Jasiukajtis 1.567258302596026515190288816001e-10L, 1.742241535800378094231540188685e-10L, 404*25c28e83SPiotr Jasiukajtis 3.038550253253096300737572104929e-11L, 5.925991958164150280814584656688e-11L, 405*25c28e83SPiotr Jasiukajtis 3.355266774764151155289750652594e-11L, 2.637254809561744853531409402995e-11L, 406*25c28e83SPiotr Jasiukajtis 3.227621096606048365493782702458e-11L, 1.094459672377587282585894259882e-10L, 407*25c28e83SPiotr Jasiukajtis 6.064676448464127209709358607166e-11L, 1.182850444360454453720999258140e-10L, 408*25c28e83SPiotr Jasiukajtis 1.428492049425553288966601449688e-11L, 3.032079976125434624889374125094e-10L, 409*25c28e83SPiotr Jasiukajtis 3.784543889504767060855636487744e-10L, 3.540092982887960328254439790467e-10L, 410*25c28e83SPiotr Jasiukajtis 4.020318667701700464612998296302e-10L, 4.544042324059585739827798668654e-10L, 411*25c28e83SPiotr Jasiukajtis 3.645299460952866120296998202703e-10L, 2.776662293911361485235212513020e-12L, 412*25c28e83SPiotr Jasiukajtis 1.708865101734375304910370400700e-10L, 3.909810965716415233488278047493e-10L, 413*25c28e83SPiotr Jasiukajtis 7.606461848875826105025137974947e-11L, 3.263814502297453347587046149712e-10L, 414*25c28e83SPiotr Jasiukajtis 1.499334758629144388918183376012e-10L, 3.771581242675818925565576303133e-10L, 415*25c28e83SPiotr Jasiukajtis 1.746932950084818923507049088298e-11L, 2.837781909176306820465786987027e-10L, 416*25c28e83SPiotr Jasiukajtis 3.859312847318946163435901230778e-10L, 4.601335192895268187473357720101e-10L, 417*25c28e83SPiotr Jasiukajtis 2.811262558622337888849804940684e-10L, 4.060360843532416964489955306249e-10L, 418*25c28e83SPiotr Jasiukajtis 8.058369357752989796958168458531e-11L, 3.725546414244147566166855921414e-10L, 419*25c28e83SPiotr Jasiukajtis 1.040286509953292907344053122733e-10L, 3.094968093808145773271362531155e-10L, 420*25c28e83SPiotr Jasiukajtis 4.454811192340438979284756311844e-10L, 5.676678748199027602705574110388e-11L, 421*25c28e83SPiotr Jasiukajtis 2.518376833121948163898128509842e-10L, 3.907837370041422778250991189943e-10L, 422*25c28e83SPiotr Jasiukajtis 7.687158710333735613246114865100e-11L, 1.334418885622867537060685125566e-10L, 423*25c28e83SPiotr Jasiukajtis 1.353147719826124443836432060856e-10L, 2.825131007652335581739282335732e-10L, 424*25c28e83SPiotr Jasiukajtis 4.161925466840049254333079881002e-10L, 4.265713490956410156084891599630e-10L, 425*25c28e83SPiotr Jasiukajtis 2.437693664320585461575989523716e-10L, 4.466519138542116247357297503086e-10L, 426*25c28e83SPiotr Jasiukajtis 3.113875178143440979746983590908e-10L, 4.910822904159495654488736486097e-11L, 427*25c28e83SPiotr Jasiukajtis 2.818831329324169810481585538618e-12L, 7.767009768334052125229252512543e-12L, 428*25c28e83SPiotr Jasiukajtis 3.698307026936191862258804165254e-10L, 429*25c28e83SPiotr Jasiukajtis #endif 430*25c28e83SPiotr Jasiukajtis }; 431*25c28e83SPiotr Jasiukajtis 432*25c28e83SPiotr Jasiukajtis /* 433*25c28e83SPiotr Jasiukajtis * mx_atanl(x, err) 434*25c28e83SPiotr Jasiukajtis * Table look-up algorithm 435*25c28e83SPiotr Jasiukajtis * By K.C. Ng, March 9, 1989 436*25c28e83SPiotr Jasiukajtis * 437*25c28e83SPiotr Jasiukajtis * Algorithm. 438*25c28e83SPiotr Jasiukajtis * 439*25c28e83SPiotr Jasiukajtis * The algorithm is based on atan(x)=atan(y)+atan((x-y)/(1+x*y)). 440*25c28e83SPiotr Jasiukajtis * We use poly1(x) to approximate atan(x) for x in [0,1/8] with 441*25c28e83SPiotr Jasiukajtis * error (relative) 442*25c28e83SPiotr Jasiukajtis * |(atan(x)-poly1(x))/x|<= 2^-140 443*25c28e83SPiotr Jasiukajtis * 444*25c28e83SPiotr Jasiukajtis * and use poly2(x) to approximate atan(x) for x in [0,1/65] with 445*25c28e83SPiotr Jasiukajtis * error 446*25c28e83SPiotr Jasiukajtis * |atan(x)-poly2(x)|<= 2^-143.7 447*25c28e83SPiotr Jasiukajtis * 448*25c28e83SPiotr Jasiukajtis * Here poly1 and poly2 are odd polynomial with the following form: 449*25c28e83SPiotr Jasiukajtis * x + x^3*(a1+x^2*(a2+...)) 450*25c28e83SPiotr Jasiukajtis * 451*25c28e83SPiotr Jasiukajtis * (0). Purge off Inf and NaN and 0 452*25c28e83SPiotr Jasiukajtis * (1). Reduce x to positive by atan(x) = -atan(-x). 453*25c28e83SPiotr Jasiukajtis * (2). For x <= 1/8, use 454*25c28e83SPiotr Jasiukajtis * (2.1) if x < 2^(-prec/2), atan(x) = x with inexact flag raised 455*25c28e83SPiotr Jasiukajtis * (2.2) Otherwise 456*25c28e83SPiotr Jasiukajtis * atan(x) = poly1(x) 457*25c28e83SPiotr Jasiukajtis * (3). For x >= 8 then (prec = 78) 458*25c28e83SPiotr Jasiukajtis * (3.1) if x >= 2^prec, atan(x) = atan(inf) - pio2_lo 459*25c28e83SPiotr Jasiukajtis * (3.2) if x >= 2^(prec/3), atan(x) = atan(inf) - 1/x 460*25c28e83SPiotr Jasiukajtis * (3.3) if x > 65, atan(x) = atan(inf) - poly2(1/x) 461*25c28e83SPiotr Jasiukajtis * (3.4) Otherwise, atan(x) = atan(inf) - poly1(1/x) 462*25c28e83SPiotr Jasiukajtis * 463*25c28e83SPiotr Jasiukajtis * (4). Now x is in (0.125, 8) 464*25c28e83SPiotr Jasiukajtis * Find y that match x to 4.5 bit after binary (easy). 465*25c28e83SPiotr Jasiukajtis * If iy is the high word of y, then 466*25c28e83SPiotr Jasiukajtis * single : j = (iy - 0x3e000000) >> 19 467*25c28e83SPiotr Jasiukajtis * double : j = (iy - 0x3fc00000) >> 16 468*25c28e83SPiotr Jasiukajtis * quad : j = (iy - 0x3ffc0000) >> 12 469*25c28e83SPiotr Jasiukajtis * 470*25c28e83SPiotr Jasiukajtis * Let s = (x-y)/(1+x*y). Then 471*25c28e83SPiotr Jasiukajtis * atan(x) = atan(y) + poly1(s) 472*25c28e83SPiotr Jasiukajtis * = _TBL_atan_hi[j] + (_TBL_atan_lo[j] + poly2(s) ) 473*25c28e83SPiotr Jasiukajtis * 474*25c28e83SPiotr Jasiukajtis * Note. |s| <= 1.5384615385e-02 = 1/65. Maxium occurs at x = 1.03125 475*25c28e83SPiotr Jasiukajtis * 476*25c28e83SPiotr Jasiukajtis */ 477*25c28e83SPiotr Jasiukajtis 478*25c28e83SPiotr Jasiukajtis /* 479*25c28e83SPiotr Jasiukajtis * p[0] - p[16] for atan(x) = 480*25c28e83SPiotr Jasiukajtis * x + x^3*(p1+x^2*(p2+...)) 481*25c28e83SPiotr Jasiukajtis */ 482*25c28e83SPiotr Jasiukajtis static const long double pe[] = { 483*25c28e83SPiotr Jasiukajtis 1.0L, 484*25c28e83SPiotr Jasiukajtis 0.0L, 485*25c28e83SPiotr Jasiukajtis #if defined(__sparc) 486*25c28e83SPiotr Jasiukajtis -0.33333333333333332870740406406184774823L, 487*25c28e83SPiotr Jasiukajtis -4.62592926927148558508441072595508240609e-18L, 488*25c28e83SPiotr Jasiukajtis 0.19999999999999999722444243843710864894L, 489*25c28e83SPiotr Jasiukajtis 2.77555756156289124602047010782090464486e-18L, 490*25c28e83SPiotr Jasiukajtis -0.14285714285714285615158658515611023176L, 491*25c28e83SPiotr Jasiukajtis -9.91270557700756738621231719241800559409e-19L, 492*25c28e83SPiotr Jasiukajtis #elif defined(__x86) 493*25c28e83SPiotr Jasiukajtis -0.33333333325572311878204345703125L, 494*25c28e83SPiotr Jasiukajtis -7.76102145512898763020833333192787755766644373e-11L, 495*25c28e83SPiotr Jasiukajtis 0.19999999995343387126922607421875L, 496*25c28e83SPiotr Jasiukajtis 4.65661287307739257812498949613909375938538636e-11L, 497*25c28e83SPiotr Jasiukajtis -0.142857142840512096881866455078125L, 498*25c28e83SPiotr Jasiukajtis -1.66307602609906877787419703858463013035681375e-11L, 499*25c28e83SPiotr Jasiukajtis #endif 500*25c28e83SPiotr Jasiukajtis }; 501*25c28e83SPiotr Jasiukajtis 502*25c28e83SPiotr Jasiukajtis static const long double p[] = { /* p[0] - p[16] */ 503*25c28e83SPiotr Jasiukajtis 1.0L, 504*25c28e83SPiotr Jasiukajtis -3.33333333333333333333333333333333333319278775586e-0001L, 505*25c28e83SPiotr Jasiukajtis 1.99999999999999999999999999999999894961390937601e-0001L, 506*25c28e83SPiotr Jasiukajtis -1.42857142857142857142857142856866970385846301312e-0001L, 507*25c28e83SPiotr Jasiukajtis 1.11111111111111111111111110742899094415954427738e-0001L, 508*25c28e83SPiotr Jasiukajtis -9.09090909090909090909087972707015549231951421806e-0002L, 509*25c28e83SPiotr Jasiukajtis 7.69230769230769230767699003016385628597359717046e-0002L, 510*25c28e83SPiotr Jasiukajtis -6.66666666666666666113842763495291228025226575259e-0002L, 511*25c28e83SPiotr Jasiukajtis 5.88235294117646915706902204947653640091126695962e-0002L, 512*25c28e83SPiotr Jasiukajtis -5.26315789473657016886225044679594035524579379810e-0002L, 513*25c28e83SPiotr Jasiukajtis 4.76190476186633969331771169790375592681525481267e-0002L, 514*25c28e83SPiotr Jasiukajtis -4.34782608290146274616081389793141896576997370161e-0002L, 515*25c28e83SPiotr Jasiukajtis 3.99999968161267722260103962788865225205057218988e-0002L, 516*25c28e83SPiotr Jasiukajtis -3.70368536844778256320786172745225703228683638328e-0002L, 517*25c28e83SPiotr Jasiukajtis 3.44752320396524479494062858284036892703898522150e-0002L, 518*25c28e83SPiotr Jasiukajtis -3.20491216046653214683721787776813360591233428081e-0002L, 519*25c28e83SPiotr Jasiukajtis 2.67632651033434456758550618122802167256870856514e-0002L, 520*25c28e83SPiotr Jasiukajtis }; 521*25c28e83SPiotr Jasiukajtis 522*25c28e83SPiotr Jasiukajtis /* q[0] - q[9] */ 523*25c28e83SPiotr Jasiukajtis static const long double qe[] = { 524*25c28e83SPiotr Jasiukajtis 1.0L, 525*25c28e83SPiotr Jasiukajtis 0.0L, 526*25c28e83SPiotr Jasiukajtis #if defined(__sparc) 527*25c28e83SPiotr Jasiukajtis -0.33333333333333332870740406406184774823486804962158203125L, 528*25c28e83SPiotr Jasiukajtis -4.625929269271485585069345465471207312531868714634217630e-18L, 529*25c28e83SPiotr Jasiukajtis 0.19999999999999999722444243843710864894092082977294921875L, 530*25c28e83SPiotr Jasiukajtis 2.7755575615628864268260553912956813621977220359134667560e-18L, 531*25c28e83SPiotr Jasiukajtis #elif defined(__x86) 532*25c28e83SPiotr Jasiukajtis -0.33333333325572311878204345703125L, 533*25c28e83SPiotr Jasiukajtis -7.76102145512898763020833333042135150927893e-11L, 534*25c28e83SPiotr Jasiukajtis 0.19999999995343387126922607421875L, 535*25c28e83SPiotr Jasiukajtis 4.656612873077392578124507576697622106863058e-11L, 536*25c28e83SPiotr Jasiukajtis #endif 537*25c28e83SPiotr Jasiukajtis }; 538*25c28e83SPiotr Jasiukajtis 539*25c28e83SPiotr Jasiukajtis static const long double q[] = { /* q[0] - q[9] */ 540*25c28e83SPiotr Jasiukajtis -3.33333333333333333333333333333333333304213515094e-0001L, 541*25c28e83SPiotr Jasiukajtis 1.99999999999999999999999999999995075766976221077e-0001L, 542*25c28e83SPiotr Jasiukajtis -1.42857142857142857142857142570379604317921113079e-0001L, 543*25c28e83SPiotr Jasiukajtis 1.11111111111111111111102923861900979127978214077e-0001L, 544*25c28e83SPiotr Jasiukajtis -9.09090909090909089586854075816999506863320031460e-0002L, 545*25c28e83SPiotr Jasiukajtis 7.69230769230756334929213246003824644696974730368e-0002L, 546*25c28e83SPiotr Jasiukajtis -6.66666666589192433974402013508912138168133579856e-0002L, 547*25c28e83SPiotr Jasiukajtis 5.88235013696778007696800252045588307023299350858e-0002L, 548*25c28e83SPiotr Jasiukajtis -5.25754959898164576495303840687699583228444695685e-0002L, 549*25c28e83SPiotr Jasiukajtis }; 550*25c28e83SPiotr Jasiukajtis 551*25c28e83SPiotr Jasiukajtis static const long double 552*25c28e83SPiotr Jasiukajtis two8700 = 9.140338438955067659002088492701e+2618L, /* 2^8700 */ 553*25c28e83SPiotr Jasiukajtis twom8700 = 1.094051392821643668051436593760e-2619L, /* 2^-8700 */ 554*25c28e83SPiotr Jasiukajtis one = 1.0L, 555*25c28e83SPiotr Jasiukajtis zero = 0.0L, 556*25c28e83SPiotr Jasiukajtis pi = 3.1415926535897932384626433832795028841971693993751L, 557*25c28e83SPiotr Jasiukajtis pio2 = 1.57079632679489661923132169163975144209858469968755L, 558*25c28e83SPiotr Jasiukajtis pio4 = 0.785398163397448309615660845819875721049292349843776L, 559*25c28e83SPiotr Jasiukajtis pi3o4 = 2.356194490192344928846982537459627163147877049531329L, 560*25c28e83SPiotr Jasiukajtis #if defined(__sparc) 561*25c28e83SPiotr Jasiukajtis pi_lo = 8.67181013012378102479704402604335196876232e-35L, 562*25c28e83SPiotr Jasiukajtis pio2_lo = 4.33590506506189051239852201302167598438116e-35L, 563*25c28e83SPiotr Jasiukajtis pio4_lo = 2.16795253253094525619926100651083799219058e-35L, 564*25c28e83SPiotr Jasiukajtis pi3o4_lo = 6.50385759759283576859778301953251397657174e-35L; 565*25c28e83SPiotr Jasiukajtis #elif defined(__x86) 566*25c28e83SPiotr Jasiukajtis pi_lo = -5.01655761266833202355732708e-20L, 567*25c28e83SPiotr Jasiukajtis pio2_lo = -2.50827880633416601177866354e-20L, 568*25c28e83SPiotr Jasiukajtis pio4_lo = -1.25413940316708300588933177e-20L, 569*25c28e83SPiotr Jasiukajtis pi3o4_lo = -9.18342907192877118770525931e-20L; 570*25c28e83SPiotr Jasiukajtis #endif 571*25c28e83SPiotr Jasiukajtis 572*25c28e83SPiotr Jasiukajtis static long double 573*25c28e83SPiotr Jasiukajtis mx_atanl(long double x, long double *err) { 574*25c28e83SPiotr Jasiukajtis long double y, z, r, s, t, w, s_h, s_l, x_h, x_l, zz[3], ee[2], z_h, 575*25c28e83SPiotr Jasiukajtis z_l, r_h, r_l, u, v; 576*25c28e83SPiotr Jasiukajtis int ix, iy, hx, i, j; 577*25c28e83SPiotr Jasiukajtis float fx; 578*25c28e83SPiotr Jasiukajtis 579*25c28e83SPiotr Jasiukajtis hx = HI_XWORD(x); 580*25c28e83SPiotr Jasiukajtis ix = hx & (~0x80000000); 581*25c28e83SPiotr Jasiukajtis 582*25c28e83SPiotr Jasiukajtis /* for |x| < 1/8 */ 583*25c28e83SPiotr Jasiukajtis if (ix < 0x3ffc0000) { 584*25c28e83SPiotr Jasiukajtis if (ix < 0x3ff30000) { /* when |x| < 2**-12 */ 585*25c28e83SPiotr Jasiukajtis if (ix < 0x3fc60000) { /* if |x| < 2**-prec/2 */ 586*25c28e83SPiotr Jasiukajtis *err = (long double) ((int) x); 587*25c28e83SPiotr Jasiukajtis return (x); 588*25c28e83SPiotr Jasiukajtis } 589*25c28e83SPiotr Jasiukajtis z = x * x; 590*25c28e83SPiotr Jasiukajtis t = q[8]; 591*25c28e83SPiotr Jasiukajtis for (i = 7; i >= 0; i--) t = q[i] + z * t; 592*25c28e83SPiotr Jasiukajtis t *= x * z; 593*25c28e83SPiotr Jasiukajtis r = x + t; 594*25c28e83SPiotr Jasiukajtis *err = t - (r - x); 595*25c28e83SPiotr Jasiukajtis return (r); 596*25c28e83SPiotr Jasiukajtis } 597*25c28e83SPiotr Jasiukajtis z = x * x; 598*25c28e83SPiotr Jasiukajtis 599*25c28e83SPiotr Jasiukajtis /* use long double precision at p4 and on */ 600*25c28e83SPiotr Jasiukajtis t = p[16]; 601*25c28e83SPiotr Jasiukajtis for (i = 15; i >= 4; i--) t = p[i] + z * t; 602*25c28e83SPiotr Jasiukajtis ee[0] = z * t; 603*25c28e83SPiotr Jasiukajtis 604*25c28e83SPiotr Jasiukajtis x_h = x; HALF(x_h); 605*25c28e83SPiotr Jasiukajtis z_h = z; HALF(z_h); 606*25c28e83SPiotr Jasiukajtis x_l = x - x_h; 607*25c28e83SPiotr Jasiukajtis z_l = (x_h * x_h - z_h); 608*25c28e83SPiotr Jasiukajtis zz[0] = z; 609*25c28e83SPiotr Jasiukajtis zz[1] = z_h; 610*25c28e83SPiotr Jasiukajtis zz[2] = z_l + x_l * (x + x_h); 611*25c28e83SPiotr Jasiukajtis 612*25c28e83SPiotr Jasiukajtis /* compute (1+z*(p1+z*(p2+z*(p3+e)))) */ 613*25c28e83SPiotr Jasiukajtis 614*25c28e83SPiotr Jasiukajtis mx_polyl(zz, pe, ee, 3); 615*25c28e83SPiotr Jasiukajtis 616*25c28e83SPiotr Jasiukajtis /* finally x*(1+z*(p1+...)) */ 617*25c28e83SPiotr Jasiukajtis r = x_h * ee[0]; 618*25c28e83SPiotr Jasiukajtis t = x * ee[1] + x_l * ee[0]; 619*25c28e83SPiotr Jasiukajtis s = t + r; 620*25c28e83SPiotr Jasiukajtis *err = t - (s - r); 621*25c28e83SPiotr Jasiukajtis return (s); 622*25c28e83SPiotr Jasiukajtis } 623*25c28e83SPiotr Jasiukajtis /* for |x| >= 8.0 */ 624*25c28e83SPiotr Jasiukajtis if (ix >= 0x40020000) { /* x >= 8 */ 625*25c28e83SPiotr Jasiukajtis x = fabsl(x); 626*25c28e83SPiotr Jasiukajtis if (ix >= 0x402e0000) { /* x >= 2**47 */ 627*25c28e83SPiotr Jasiukajtis if (ix >= 0x408b0000) { /* x >= 2**140 */ 628*25c28e83SPiotr Jasiukajtis y = -pio2_lo; 629*25c28e83SPiotr Jasiukajtis } else 630*25c28e83SPiotr Jasiukajtis y = one / x - pio2_lo; 631*25c28e83SPiotr Jasiukajtis if (hx >= 0) { 632*25c28e83SPiotr Jasiukajtis t = pio2 - y; 633*25c28e83SPiotr Jasiukajtis *err = -(y - (pio2 - t)); 634*25c28e83SPiotr Jasiukajtis } else { 635*25c28e83SPiotr Jasiukajtis t = y - pio2; 636*25c28e83SPiotr Jasiukajtis *err = y - (pio2 + t); 637*25c28e83SPiotr Jasiukajtis } 638*25c28e83SPiotr Jasiukajtis return (t); 639*25c28e83SPiotr Jasiukajtis } else { 640*25c28e83SPiotr Jasiukajtis /* compute r = 1/x */ 641*25c28e83SPiotr Jasiukajtis r = one / x; 642*25c28e83SPiotr Jasiukajtis z = r * r; 643*25c28e83SPiotr Jasiukajtis x_h = x; HALF(x_h); 644*25c28e83SPiotr Jasiukajtis r_h = r; HALF(r_h); 645*25c28e83SPiotr Jasiukajtis z_h = z; HALF(z_h); 646*25c28e83SPiotr Jasiukajtis r_l = r * ((x_h - x) * r_h - (x_h * r_h - one)); 647*25c28e83SPiotr Jasiukajtis z_l = (r_h * r_h - z_h); 648*25c28e83SPiotr Jasiukajtis zz[0] = z; 649*25c28e83SPiotr Jasiukajtis zz[1] = z_h; 650*25c28e83SPiotr Jasiukajtis zz[2] = z_l + r_l * (r + r_h); 651*25c28e83SPiotr Jasiukajtis if (ix < 0x40050400) { /* 8 < x < 65 */ 652*25c28e83SPiotr Jasiukajtis /* use double precision at p4 and on */ 653*25c28e83SPiotr Jasiukajtis t = p[16]; 654*25c28e83SPiotr Jasiukajtis for (i = 15; i >= 4; i--) t = p[i] + z * t; 655*25c28e83SPiotr Jasiukajtis ee[0] = z * t; 656*25c28e83SPiotr Jasiukajtis /* compute (1+z*(p1+z*(p2+z*(p3+e)))) */ 657*25c28e83SPiotr Jasiukajtis mx_polyl(zz, pe, ee, 3); 658*25c28e83SPiotr Jasiukajtis } else { /* x < 65 < 2**47 */ 659*25c28e83SPiotr Jasiukajtis /* use long double at q3 and on */ 660*25c28e83SPiotr Jasiukajtis t = q[8]; 661*25c28e83SPiotr Jasiukajtis for (i = 7; i >= 2; i--) t = q[i] + z * t; 662*25c28e83SPiotr Jasiukajtis ee[0] = z * t; 663*25c28e83SPiotr Jasiukajtis /* compute (1+z*(q1+z*(q2+e))) */ 664*25c28e83SPiotr Jasiukajtis mx_polyl(zz, qe, ee, 2); 665*25c28e83SPiotr Jasiukajtis } 666*25c28e83SPiotr Jasiukajtis /* pio2 - r*(1+...) */ 667*25c28e83SPiotr Jasiukajtis v = r_h * ee[0]; 668*25c28e83SPiotr Jasiukajtis t = pio2_lo - (r * ee[1] + r_l * ee[0]); 669*25c28e83SPiotr Jasiukajtis if (hx >= 0) { 670*25c28e83SPiotr Jasiukajtis s = pio2 - v; 671*25c28e83SPiotr Jasiukajtis t -= (v - (pio2 - s)); 672*25c28e83SPiotr Jasiukajtis } else { 673*25c28e83SPiotr Jasiukajtis s = v - pio2; 674*25c28e83SPiotr Jasiukajtis t = -(t - (v - (s + pio2))); 675*25c28e83SPiotr Jasiukajtis } 676*25c28e83SPiotr Jasiukajtis w = s + t; 677*25c28e83SPiotr Jasiukajtis *err = t - (w - s); 678*25c28e83SPiotr Jasiukajtis return (w); 679*25c28e83SPiotr Jasiukajtis } 680*25c28e83SPiotr Jasiukajtis } 681*25c28e83SPiotr Jasiukajtis /* now x is between 1/8 and 8 */ 682*25c28e83SPiotr Jasiukajtis iy = (ix + 0x00000800) & 0x7ffff000; 683*25c28e83SPiotr Jasiukajtis j = (iy - 0x3ffc0000) >> 12; 684*25c28e83SPiotr Jasiukajtis ((int *) &fx)[0] = 0x3e000000 + (j << 19); 685*25c28e83SPiotr Jasiukajtis y = (long double) fx; 686*25c28e83SPiotr Jasiukajtis x = fabsl(x); 687*25c28e83SPiotr Jasiukajtis 688*25c28e83SPiotr Jasiukajtis w = (x - y); 689*25c28e83SPiotr Jasiukajtis v = 1.0L / (one + x * y); 690*25c28e83SPiotr Jasiukajtis s = w * v; 691*25c28e83SPiotr Jasiukajtis z = s * s; 692*25c28e83SPiotr Jasiukajtis /* use long double precision at q3 and on */ 693*25c28e83SPiotr Jasiukajtis t = q[8]; 694*25c28e83SPiotr Jasiukajtis for (i = 7; i >= 2; i--) t = q[i] + z * t; 695*25c28e83SPiotr Jasiukajtis ee[0] = z * t; 696*25c28e83SPiotr Jasiukajtis s_h = s; HALF(s_h); 697*25c28e83SPiotr Jasiukajtis z_h = z; HALF(z_h); 698*25c28e83SPiotr Jasiukajtis x_h = x; HALF(x_h); 699*25c28e83SPiotr Jasiukajtis t = one + x * y; HALF(t); 700*25c28e83SPiotr Jasiukajtis r = -((x_h - x) * y - (x_h * y - (t - one))); 701*25c28e83SPiotr Jasiukajtis s_l = -v * (s_h * r - (w - s_h * t)); 702*25c28e83SPiotr Jasiukajtis z_l = (s_h * s_h - z_h); 703*25c28e83SPiotr Jasiukajtis zz[0] = z; 704*25c28e83SPiotr Jasiukajtis zz[1] = z_h; 705*25c28e83SPiotr Jasiukajtis zz[2] = z_l + s_l * (s + s_h); 706*25c28e83SPiotr Jasiukajtis /* compute (1+z*(q1+z*(q2+e))) by call mx_poly */ 707*25c28e83SPiotr Jasiukajtis mx_polyl(zz, qe, ee, 2); 708*25c28e83SPiotr Jasiukajtis v = s_h * ee[0]; 709*25c28e83SPiotr Jasiukajtis t = TBL_atan_lol[j] + (s * ee[1] + s_l * ee[0]); 710*25c28e83SPiotr Jasiukajtis u = TBL_atan_hil[j]; 711*25c28e83SPiotr Jasiukajtis s = u + v; 712*25c28e83SPiotr Jasiukajtis t += (v - (s - u)); 713*25c28e83SPiotr Jasiukajtis w = s + t; 714*25c28e83SPiotr Jasiukajtis *err = t - (w - s); 715*25c28e83SPiotr Jasiukajtis if (hx < 0) { 716*25c28e83SPiotr Jasiukajtis w = -w; 717*25c28e83SPiotr Jasiukajtis *err = -*err; 718*25c28e83SPiotr Jasiukajtis } 719*25c28e83SPiotr Jasiukajtis return (w); 720*25c28e83SPiotr Jasiukajtis } 721*25c28e83SPiotr Jasiukajtis 722*25c28e83SPiotr Jasiukajtis long double 723*25c28e83SPiotr Jasiukajtis __k_atan2l(long double y, long double x, long double *w) { 724*25c28e83SPiotr Jasiukajtis long double t, xh, th, t1, t2, w1, w2; 725*25c28e83SPiotr Jasiukajtis int ix, iy, hx, hy; 726*25c28e83SPiotr Jasiukajtis 727*25c28e83SPiotr Jasiukajtis hy = HI_XWORD(y); 728*25c28e83SPiotr Jasiukajtis hx = HI_XWORD(x); 729*25c28e83SPiotr Jasiukajtis iy = hy & ~0x80000000; 730*25c28e83SPiotr Jasiukajtis ix = hx & ~0x80000000; 731*25c28e83SPiotr Jasiukajtis 732*25c28e83SPiotr Jasiukajtis *w = 0.0; 733*25c28e83SPiotr Jasiukajtis if (ix >= 0x7fff0000 || iy >= 0x7fff0000) { /* ignore inexact */ 734*25c28e83SPiotr Jasiukajtis if (isnanl(x) || isnanl(y)) 735*25c28e83SPiotr Jasiukajtis return (x * y); 736*25c28e83SPiotr Jasiukajtis else if (iy < 0x7fff0000) { 737*25c28e83SPiotr Jasiukajtis if (hx >= 0) { /* ATAN2(+-finite, +inf) is +-0 */ 738*25c28e83SPiotr Jasiukajtis *w *= y; 739*25c28e83SPiotr Jasiukajtis return (*w); 740*25c28e83SPiotr Jasiukajtis } else { /* ATAN2(+-finite, -inf) is +-pi */ 741*25c28e83SPiotr Jasiukajtis *w = copysignl(pi_lo, y); 742*25c28e83SPiotr Jasiukajtis return (copysignl(pi, y)); 743*25c28e83SPiotr Jasiukajtis } 744*25c28e83SPiotr Jasiukajtis } else if (ix < 0x7fff0000) { 745*25c28e83SPiotr Jasiukajtis /* ATAN2(+-inf, finite) is +-pi/2 */ 746*25c28e83SPiotr Jasiukajtis *w = (hy >= 0)? pio2_lo : -pio2_lo; 747*25c28e83SPiotr Jasiukajtis return ((hy >= 0)? pio2 : -pio2); 748*25c28e83SPiotr Jasiukajtis } else if (hx > 0) { /* ATAN2(+-INF,+INF) = +-pi/4 */ 749*25c28e83SPiotr Jasiukajtis *w = (hy >= 0)? pio4_lo : -pio4_lo; 750*25c28e83SPiotr Jasiukajtis return ((hy >= 0)? pio4 : -pio4); 751*25c28e83SPiotr Jasiukajtis } else { /* ATAN2(+-INF,-INF) = +-3pi/4 */ 752*25c28e83SPiotr Jasiukajtis *w = (hy >= 0)? pi3o4_lo : -pi3o4_lo; 753*25c28e83SPiotr Jasiukajtis return ((hy >= 0)? pi3o4 : -pi3o4); 754*25c28e83SPiotr Jasiukajtis } 755*25c28e83SPiotr Jasiukajtis } else if (x == zero || y == zero) { 756*25c28e83SPiotr Jasiukajtis if (y == zero) { 757*25c28e83SPiotr Jasiukajtis if (hx >= 0) /* ATAN2(+-0, +(0 <= x <= inf)) is +-0 */ 758*25c28e83SPiotr Jasiukajtis return (y); 759*25c28e83SPiotr Jasiukajtis else { /* ATAN2(+-0, -(0 <= x <= inf)) is +-pi */ 760*25c28e83SPiotr Jasiukajtis *w = (hy >= 0)? pi_lo : -pi_lo; 761*25c28e83SPiotr Jasiukajtis return ((hy >= 0)? pi : -pi); 762*25c28e83SPiotr Jasiukajtis } 763*25c28e83SPiotr Jasiukajtis } else { /* ATAN2(+-(anything but 0 and NaN), 0) is +-pi/2 */ 764*25c28e83SPiotr Jasiukajtis *w = (hy >= 0)? pio2_lo : -pio2_lo; 765*25c28e83SPiotr Jasiukajtis return ((hy >= 0)? pio2 : -pio2); 766*25c28e83SPiotr Jasiukajtis } 767*25c28e83SPiotr Jasiukajtis } else if (iy - ix > 0x00640000) { /* |x/y| < 2 ** -100 */ 768*25c28e83SPiotr Jasiukajtis *w = (hy >= 0)? pio2_lo : -pio2_lo; 769*25c28e83SPiotr Jasiukajtis return ((hy >= 0)? pio2 : -pio2); 770*25c28e83SPiotr Jasiukajtis } else if (ix - iy > 0x00640000) { /* |y/x| < 2 ** -100 */ 771*25c28e83SPiotr Jasiukajtis if (hx < 0) { 772*25c28e83SPiotr Jasiukajtis *w = (hy >= 0)? pi_lo : -pi_lo; 773*25c28e83SPiotr Jasiukajtis return ((hy >= 0)? pi : -pi); 774*25c28e83SPiotr Jasiukajtis } else { 775*25c28e83SPiotr Jasiukajtis t = y / x; 776*25c28e83SPiotr Jasiukajtis th = t; HALF(th); 777*25c28e83SPiotr Jasiukajtis xh = x; HALF(xh); 778*25c28e83SPiotr Jasiukajtis t1 = (x - xh) * t + xh * (t - th); 779*25c28e83SPiotr Jasiukajtis t2 = y - xh * th; 780*25c28e83SPiotr Jasiukajtis *w = (t2 - t1) / x; 781*25c28e83SPiotr Jasiukajtis return (t); 782*25c28e83SPiotr Jasiukajtis } 783*25c28e83SPiotr Jasiukajtis } else { 784*25c28e83SPiotr Jasiukajtis if (ix >= 0x5fff3000) { 785*25c28e83SPiotr Jasiukajtis x *= twom8700; 786*25c28e83SPiotr Jasiukajtis y *= twom8700; 787*25c28e83SPiotr Jasiukajtis } else if (ix < 0x203d0000) { 788*25c28e83SPiotr Jasiukajtis x *= two8700; 789*25c28e83SPiotr Jasiukajtis y *= two8700; 790*25c28e83SPiotr Jasiukajtis } 791*25c28e83SPiotr Jasiukajtis y = fabsl(y); 792*25c28e83SPiotr Jasiukajtis x = fabsl(x); 793*25c28e83SPiotr Jasiukajtis t = y / x; 794*25c28e83SPiotr Jasiukajtis th = t; HALF(th); 795*25c28e83SPiotr Jasiukajtis xh = x; HALF(xh); 796*25c28e83SPiotr Jasiukajtis t1 = (x - xh) * t + xh * (t - th); 797*25c28e83SPiotr Jasiukajtis t2 = y - xh * th; 798*25c28e83SPiotr Jasiukajtis w1 = mx_atanl(t, &w2); 799*25c28e83SPiotr Jasiukajtis w2 += (t2 - t1) / (x + y * t); 800*25c28e83SPiotr Jasiukajtis if (hx < 0) { 801*25c28e83SPiotr Jasiukajtis t1 = pi - w1; 802*25c28e83SPiotr Jasiukajtis t2 = pi - t1; 803*25c28e83SPiotr Jasiukajtis w2 = (pi_lo - w2) - (w1 - t2); 804*25c28e83SPiotr Jasiukajtis w1 = t1; 805*25c28e83SPiotr Jasiukajtis } 806*25c28e83SPiotr Jasiukajtis *w = (hy >= 0)? w2 : -w2; 807*25c28e83SPiotr Jasiukajtis return ((hy >= 0)? w1 : -w1); 808*25c28e83SPiotr Jasiukajtis } 809*25c28e83SPiotr Jasiukajtis } 810