1 2 /******************************************************************************* 3 MIT License 4 ----------- 5 6 Copyright (c) 2002-2019 Advanced Micro Devices, Inc. 7 8 Permission is hereby granted, free of charge, to any person obtaining a copy 9 of this Software and associated documentaon files (the "Software"), to deal 10 in the Software without restriction, including without limitation the rights 11 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 copies of the Software, and to permit persons to whom the Software is 13 furnished to do so, subject to the following conditions: 14 15 The above copyright notice and this permission notice shall be included in 16 all copies or substantial portions of the Software. 17 18 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 THE SOFTWARE. 25 *******************************************************************************/ 26 27 #include "libm.h" 28 #include "libm_util.h" 29 30 #define USE_VAL_WITH_FLAGS 31 #define USE_NAN_WITH_FLAGS 32 #define USE_SCALEDOUBLE_1 33 #define USE_SCALEDOUBLE_2 34 #define USE_SCALEUPDOUBLE1024 35 #define USE_SCALEDOWNDOUBLE 36 #define USE_HANDLE_ERROR 37 #include "libm_inlines.h" 38 #undef USE_VAL_WITH_FLAGS 39 #undef USE_NAN_WITH_FLAGS 40 #undef USE_SCALEDOUBLE_1 41 #undef USE_SCALEDOUBLE_2 42 #undef USE_SCALEUPDOUBLE1024 43 #undef USE_SCALEDOWNDOUBLE 44 #undef USE_HANDLE_ERROR 45 46 #include "libm_errno.h" 47 48 #ifdef _MSC_VER 49 #pragma function(atan2) 50 #endif 51 52 double FN_PROTOTYPE(atan2)(double y, double x) 53 { 54 /* Arrays atan_jby256_lead and atan_jby256_tail contain 55 leading and trailing parts respectively of precomputed 56 values of atan(j/256), for j = 16, 17, ..., 256. 57 atan_jby256_lead contains the first 21 bits of precision, 58 and atan_jby256_tail contains a further 53 bits precision. */ 59 60 static const double atan_jby256_lead[ 241] = { 61 6.24187886714935302734e-02, /* 0x3faff55b00000000 */ 62 6.63088560104370117188e-02, /* 0x3fb0f99e00000000 */ 63 7.01969265937805175781e-02, /* 0x3fb1f86d00000000 */ 64 7.40829110145568847656e-02, /* 0x3fb2f71900000000 */ 65 7.79666304588317871094e-02, /* 0x3fb3f59f00000000 */ 66 8.18479657173156738281e-02, /* 0x3fb4f3fd00000000 */ 67 8.57268571853637695312e-02, /* 0x3fb5f23200000000 */ 68 8.96031260490417480469e-02, /* 0x3fb6f03b00000000 */ 69 9.34767723083496093750e-02, /* 0x3fb7ee1800000000 */ 70 9.73475575447082519531e-02, /* 0x3fb8ebc500000000 */ 71 1.01215422153472900391e-01, /* 0x3fb9e94100000000 */ 72 1.05080246925354003906e-01, /* 0x3fbae68a00000000 */ 73 1.08941912651062011719e-01, /* 0x3fbbe39e00000000 */ 74 1.12800359725952148438e-01, /* 0x3fbce07c00000000 */ 75 1.16655409336090087891e-01, /* 0x3fbddd2100000000 */ 76 1.20507001876831054688e-01, /* 0x3fbed98c00000000 */ 77 1.24354958534240722656e-01, /* 0x3fbfd5ba00000000 */ 78 1.28199219703674316406e-01, /* 0x3fc068d500000000 */ 79 1.32039666175842285156e-01, /* 0x3fc0e6ad00000000 */ 80 1.35876297950744628906e-01, /* 0x3fc1646500000000 */ 81 1.39708757400512695312e-01, /* 0x3fc1e1fa00000000 */ 82 1.43537282943725585938e-01, /* 0x3fc25f6e00000000 */ 83 1.47361397743225097656e-01, /* 0x3fc2dcbd00000000 */ 84 1.51181221008300781250e-01, /* 0x3fc359e800000000 */ 85 1.54996633529663085938e-01, /* 0x3fc3d6ee00000000 */ 86 1.58807516098022460938e-01, /* 0x3fc453ce00000000 */ 87 1.62613749504089355469e-01, /* 0x3fc4d08700000000 */ 88 1.66415214538574218750e-01, /* 0x3fc54d1800000000 */ 89 1.70211911201477050781e-01, /* 0x3fc5c98100000000 */ 90 1.74003481864929199219e-01, /* 0x3fc645bf00000000 */ 91 1.77790164947509765625e-01, /* 0x3fc6c1d400000000 */ 92 1.81571602821350097656e-01, /* 0x3fc73dbd00000000 */ 93 1.85347914695739746094e-01, /* 0x3fc7b97b00000000 */ 94 1.89118742942810058594e-01, /* 0x3fc8350b00000000 */ 95 1.92884206771850585938e-01, /* 0x3fc8b06e00000000 */ 96 1.96644186973571777344e-01, /* 0x3fc92ba300000000 */ 97 2.00398445129394531250e-01, /* 0x3fc9a6a800000000 */ 98 2.04147100448608398438e-01, /* 0x3fca217e00000000 */ 99 2.07889914512634277344e-01, /* 0x3fca9c2300000000 */ 100 2.11626768112182617188e-01, /* 0x3fcb169600000000 */ 101 2.15357661247253417969e-01, /* 0x3fcb90d700000000 */ 102 2.19082474708557128906e-01, /* 0x3fcc0ae500000000 */ 103 2.22801089286804199219e-01, /* 0x3fcc84bf00000000 */ 104 2.26513504981994628906e-01, /* 0x3fccfe6500000000 */ 105 2.30219483375549316406e-01, /* 0x3fcd77d500000000 */ 106 2.33919143676757812500e-01, /* 0x3fcdf11000000000 */ 107 2.37612247467041015625e-01, /* 0x3fce6a1400000000 */ 108 2.41298794746398925781e-01, /* 0x3fcee2e100000000 */ 109 2.44978547096252441406e-01, /* 0x3fcf5b7500000000 */ 110 2.48651623725891113281e-01, /* 0x3fcfd3d100000000 */ 111 2.52317905426025390625e-01, /* 0x3fd025fa00000000 */ 112 2.55977153778076171875e-01, /* 0x3fd061ee00000000 */ 113 2.59629487991333007812e-01, /* 0x3fd09dc500000000 */ 114 2.63274669647216796875e-01, /* 0x3fd0d97e00000000 */ 115 2.66912937164306640625e-01, /* 0x3fd1151a00000000 */ 116 2.70543813705444335938e-01, /* 0x3fd1509700000000 */ 117 2.74167299270629882812e-01, /* 0x3fd18bf500000000 */ 118 2.77783632278442382812e-01, /* 0x3fd1c73500000000 */ 119 2.81392335891723632812e-01, /* 0x3fd2025500000000 */ 120 2.84993648529052734375e-01, /* 0x3fd23d5600000000 */ 121 2.88587331771850585938e-01, /* 0x3fd2783700000000 */ 122 2.92173147201538085938e-01, /* 0x3fd2b2f700000000 */ 123 2.95751571655273437500e-01, /* 0x3fd2ed9800000000 */ 124 2.99322128295898437500e-01, /* 0x3fd3281800000000 */ 125 3.02884817123413085938e-01, /* 0x3fd3627700000000 */ 126 3.06439399719238281250e-01, /* 0x3fd39cb400000000 */ 127 3.09986352920532226562e-01, /* 0x3fd3d6d100000000 */ 128 3.13524961471557617188e-01, /* 0x3fd410cb00000000 */ 129 3.17055702209472656250e-01, /* 0x3fd44aa400000000 */ 130 3.20578098297119140625e-01, /* 0x3fd4845a00000000 */ 131 3.24092388153076171875e-01, /* 0x3fd4bdee00000000 */ 132 3.27598333358764648438e-01, /* 0x3fd4f75f00000000 */ 133 3.31095933914184570312e-01, /* 0x3fd530ad00000000 */ 134 3.34585189819335937500e-01, /* 0x3fd569d800000000 */ 135 3.38066101074218750000e-01, /* 0x3fd5a2e000000000 */ 136 3.41538190841674804688e-01, /* 0x3fd5dbc300000000 */ 137 3.45002174377441406250e-01, /* 0x3fd6148400000000 */ 138 3.48457098007202148438e-01, /* 0x3fd64d1f00000000 */ 139 3.51903676986694335938e-01, /* 0x3fd6859700000000 */ 140 3.55341434478759765625e-01, /* 0x3fd6bdea00000000 */ 141 3.58770608901977539062e-01, /* 0x3fd6f61900000000 */ 142 3.62190723419189453125e-01, /* 0x3fd72e2200000000 */ 143 3.65602254867553710938e-01, /* 0x3fd7660700000000 */ 144 3.69004726409912109375e-01, /* 0x3fd79dc600000000 */ 145 3.72398376464843750000e-01, /* 0x3fd7d56000000000 */ 146 3.75782966613769531250e-01, /* 0x3fd80cd400000000 */ 147 3.79158496856689453125e-01, /* 0x3fd8442200000000 */ 148 3.82525205612182617188e-01, /* 0x3fd87b4b00000000 */ 149 3.85882616043090820312e-01, /* 0x3fd8b24d00000000 */ 150 3.89230966567993164062e-01, /* 0x3fd8e92900000000 */ 151 3.92570018768310546875e-01, /* 0x3fd91fde00000000 */ 152 3.95900011062622070312e-01, /* 0x3fd9566d00000000 */ 153 3.99220705032348632812e-01, /* 0x3fd98cd500000000 */ 154 4.02532100677490234375e-01, /* 0x3fd9c31600000000 */ 155 4.05834197998046875000e-01, /* 0x3fd9f93000000000 */ 156 4.09126996994018554688e-01, /* 0x3fda2f2300000000 */ 157 4.12410259246826171875e-01, /* 0x3fda64ee00000000 */ 158 4.15684223175048828125e-01, /* 0x3fda9a9200000000 */ 159 4.18948888778686523438e-01, /* 0x3fdad00f00000000 */ 160 4.22204017639160156250e-01, /* 0x3fdb056400000000 */ 161 4.25449609756469726562e-01, /* 0x3fdb3a9100000000 */ 162 4.28685665130615234375e-01, /* 0x3fdb6f9600000000 */ 163 4.31912183761596679688e-01, /* 0x3fdba47300000000 */ 164 4.35129165649414062500e-01, /* 0x3fdbd92800000000 */ 165 4.38336372375488281250e-01, /* 0x3fdc0db400000000 */ 166 4.41534280776977539062e-01, /* 0x3fdc421900000000 */ 167 4.44722414016723632812e-01, /* 0x3fdc765500000000 */ 168 4.47900772094726562500e-01, /* 0x3fdcaa6800000000 */ 169 4.51069593429565429688e-01, /* 0x3fdcde5300000000 */ 170 4.54228639602661132812e-01, /* 0x3fdd121500000000 */ 171 4.57377910614013671875e-01, /* 0x3fdd45ae00000000 */ 172 4.60517644882202148438e-01, /* 0x3fdd791f00000000 */ 173 4.63647603988647460938e-01, /* 0x3fddac6700000000 */ 174 4.66767549514770507812e-01, /* 0x3fdddf8500000000 */ 175 4.69877958297729492188e-01, /* 0x3fde127b00000000 */ 176 4.72978591918945312500e-01, /* 0x3fde454800000000 */ 177 4.76069211959838867188e-01, /* 0x3fde77eb00000000 */ 178 4.79150056838989257812e-01, /* 0x3fdeaa6500000000 */ 179 4.82221126556396484375e-01, /* 0x3fdedcb600000000 */ 180 4.85282421112060546875e-01, /* 0x3fdf0ede00000000 */ 181 4.88333940505981445312e-01, /* 0x3fdf40dd00000000 */ 182 4.91375446319580078125e-01, /* 0x3fdf72b200000000 */ 183 4.94406938552856445312e-01, /* 0x3fdfa45d00000000 */ 184 4.97428894042968750000e-01, /* 0x3fdfd5e000000000 */ 185 5.00440597534179687500e-01, /* 0x3fe0039c00000000 */ 186 5.03442764282226562500e-01, /* 0x3fe01c3400000000 */ 187 5.06434917449951171875e-01, /* 0x3fe034b700000000 */ 188 5.09417057037353515625e-01, /* 0x3fe04d2500000000 */ 189 5.12389183044433593750e-01, /* 0x3fe0657e00000000 */ 190 5.15351772308349609375e-01, /* 0x3fe07dc300000000 */ 191 5.18304347991943359375e-01, /* 0x3fe095f300000000 */ 192 5.21246910095214843750e-01, /* 0x3fe0ae0e00000000 */ 193 5.24179458618164062500e-01, /* 0x3fe0c61400000000 */ 194 5.27101993560791015625e-01, /* 0x3fe0de0500000000 */ 195 5.30014991760253906250e-01, /* 0x3fe0f5e200000000 */ 196 5.32917976379394531250e-01, /* 0x3fe10daa00000000 */ 197 5.35810947418212890625e-01, /* 0x3fe1255d00000000 */ 198 5.38693904876708984375e-01, /* 0x3fe13cfb00000000 */ 199 5.41567325592041015625e-01, /* 0x3fe1548500000000 */ 200 5.44430732727050781250e-01, /* 0x3fe16bfa00000000 */ 201 5.47284126281738281250e-01, /* 0x3fe1835a00000000 */ 202 5.50127506256103515625e-01, /* 0x3fe19aa500000000 */ 203 5.52961349487304687500e-01, /* 0x3fe1b1dc00000000 */ 204 5.55785179138183593750e-01, /* 0x3fe1c8fe00000000 */ 205 5.58598995208740234375e-01, /* 0x3fe1e00b00000000 */ 206 5.61403274536132812500e-01, /* 0x3fe1f70400000000 */ 207 5.64197540283203125000e-01, /* 0x3fe20de800000000 */ 208 5.66981792449951171875e-01, /* 0x3fe224b700000000 */ 209 5.69756031036376953125e-01, /* 0x3fe23b7100000000 */ 210 5.72520732879638671875e-01, /* 0x3fe2521700000000 */ 211 5.75275897979736328125e-01, /* 0x3fe268a900000000 */ 212 5.78021049499511718750e-01, /* 0x3fe27f2600000000 */ 213 5.80756187438964843750e-01, /* 0x3fe2958e00000000 */ 214 5.83481788635253906250e-01, /* 0x3fe2abe200000000 */ 215 5.86197376251220703125e-01, /* 0x3fe2c22100000000 */ 216 5.88903427124023437500e-01, /* 0x3fe2d84c00000000 */ 217 5.91599464416503906250e-01, /* 0x3fe2ee6200000000 */ 218 5.94285964965820312500e-01, /* 0x3fe3046400000000 */ 219 5.96962928771972656250e-01, /* 0x3fe31a5200000000 */ 220 5.99629878997802734375e-01, /* 0x3fe3302b00000000 */ 221 6.02287292480468750000e-01, /* 0x3fe345f000000000 */ 222 6.04934692382812500000e-01, /* 0x3fe35ba000000000 */ 223 6.07573032379150390625e-01, /* 0x3fe3713d00000000 */ 224 6.10201358795166015625e-01, /* 0x3fe386c500000000 */ 225 6.12820148468017578125e-01, /* 0x3fe39c3900000000 */ 226 6.15428924560546875000e-01, /* 0x3fe3b19800000000 */ 227 6.18028640747070312500e-01, /* 0x3fe3c6e400000000 */ 228 6.20618820190429687500e-01, /* 0x3fe3dc1c00000000 */ 229 6.23198986053466796875e-01, /* 0x3fe3f13f00000000 */ 230 6.25770092010498046875e-01, /* 0x3fe4064f00000000 */ 231 6.28331184387207031250e-01, /* 0x3fe41b4a00000000 */ 232 6.30883216857910156250e-01, /* 0x3fe4303200000000 */ 233 6.33425712585449218750e-01, /* 0x3fe4450600000000 */ 234 6.35958671569824218750e-01, /* 0x3fe459c600000000 */ 235 6.38482093811035156250e-01, /* 0x3fe46e7200000000 */ 236 6.40995979309082031250e-01, /* 0x3fe4830a00000000 */ 237 6.43500804901123046875e-01, /* 0x3fe4978f00000000 */ 238 6.45996093750000000000e-01, /* 0x3fe4ac0000000000 */ 239 6.48482322692871093750e-01, /* 0x3fe4c05e00000000 */ 240 6.50959014892578125000e-01, /* 0x3fe4d4a800000000 */ 241 6.53426170349121093750e-01, /* 0x3fe4e8de00000000 */ 242 6.55884265899658203125e-01, /* 0x3fe4fd0100000000 */ 243 6.58332824707031250000e-01, /* 0x3fe5111000000000 */ 244 6.60772323608398437500e-01, /* 0x3fe5250c00000000 */ 245 6.63202762603759765625e-01, /* 0x3fe538f500000000 */ 246 6.65623664855957031250e-01, /* 0x3fe54cca00000000 */ 247 6.68035984039306640625e-01, /* 0x3fe5608d00000000 */ 248 6.70438766479492187500e-01, /* 0x3fe5743c00000000 */ 249 6.72832489013671875000e-01, /* 0x3fe587d800000000 */ 250 6.75216674804687500000e-01, /* 0x3fe59b6000000000 */ 251 6.77592277526855468750e-01, /* 0x3fe5aed600000000 */ 252 6.79958820343017578125e-01, /* 0x3fe5c23900000000 */ 253 6.82316303253173828125e-01, /* 0x3fe5d58900000000 */ 254 6.84664726257324218750e-01, /* 0x3fe5e8c600000000 */ 255 6.87004089355468750000e-01, /* 0x3fe5fbf000000000 */ 256 6.89334869384765625000e-01, /* 0x3fe60f0800000000 */ 257 6.91656589508056640625e-01, /* 0x3fe6220d00000000 */ 258 6.93969249725341796875e-01, /* 0x3fe634ff00000000 */ 259 6.96272850036621093750e-01, /* 0x3fe647de00000000 */ 260 6.98567867279052734375e-01, /* 0x3fe65aab00000000 */ 261 7.00854301452636718750e-01, /* 0x3fe66d6600000000 */ 262 7.03131675720214843750e-01, /* 0x3fe6800e00000000 */ 263 7.05400466918945312500e-01, /* 0x3fe692a400000000 */ 264 7.07660198211669921875e-01, /* 0x3fe6a52700000000 */ 265 7.09911346435546875000e-01, /* 0x3fe6b79800000000 */ 266 7.12153911590576171875e-01, /* 0x3fe6c9f700000000 */ 267 7.14387893676757812500e-01, /* 0x3fe6dc4400000000 */ 268 7.16613292694091796875e-01, /* 0x3fe6ee7f00000000 */ 269 7.18829631805419921875e-01, /* 0x3fe700a700000000 */ 270 7.21037864685058593750e-01, /* 0x3fe712be00000000 */ 271 7.23237514495849609375e-01, /* 0x3fe724c300000000 */ 272 7.25428581237792968750e-01, /* 0x3fe736b600000000 */ 273 7.27611064910888671875e-01, /* 0x3fe7489700000000 */ 274 7.29785442352294921875e-01, /* 0x3fe75a6700000000 */ 275 7.31950759887695312500e-01, /* 0x3fe76c2400000000 */ 276 7.34108448028564453125e-01, /* 0x3fe77dd100000000 */ 277 7.36257076263427734375e-01, /* 0x3fe78f6b00000000 */ 278 7.38397598266601562500e-01, /* 0x3fe7a0f400000000 */ 279 7.40530014038085937500e-01, /* 0x3fe7b26c00000000 */ 280 7.42654323577880859375e-01, /* 0x3fe7c3d300000000 */ 281 7.44770050048828125000e-01, /* 0x3fe7d52800000000 */ 282 7.46877670288085937500e-01, /* 0x3fe7e66c00000000 */ 283 7.48976707458496093750e-01, /* 0x3fe7f79e00000000 */ 284 7.51068115234375000000e-01, /* 0x3fe808c000000000 */ 285 7.53150939941406250000e-01, /* 0x3fe819d000000000 */ 286 7.55226135253906250000e-01, /* 0x3fe82ad000000000 */ 287 7.57292747497558593750e-01, /* 0x3fe83bbe00000000 */ 288 7.59351730346679687500e-01, /* 0x3fe84c9c00000000 */ 289 7.61402606964111328125e-01, /* 0x3fe85d6900000000 */ 290 7.63445377349853515625e-01, /* 0x3fe86e2500000000 */ 291 7.65480041503906250000e-01, /* 0x3fe87ed000000000 */ 292 7.67507076263427734375e-01, /* 0x3fe88f6b00000000 */ 293 7.69526004791259765625e-01, /* 0x3fe89ff500000000 */ 294 7.71537303924560546875e-01, /* 0x3fe8b06f00000000 */ 295 7.73540973663330078125e-01, /* 0x3fe8c0d900000000 */ 296 7.75536537170410156250e-01, /* 0x3fe8d13200000000 */ 297 7.77523994445800781250e-01, /* 0x3fe8e17a00000000 */ 298 7.79504299163818359375e-01, /* 0x3fe8f1b300000000 */ 299 7.81476497650146484375e-01, /* 0x3fe901db00000000 */ 300 7.83441066741943359375e-01, /* 0x3fe911f300000000 */ 301 7.85398006439208984375e-01}; /* 0x3fe921fb00000000 */ 302 303 static const double atan_jby256_tail[ 241] = { 304 2.13244638182005395671e-08, /* 0x3e56e59fbd38db2c */ 305 3.89093864761712760656e-08, /* 0x3e64e3aa54dedf96 */ 306 4.44780900009437454576e-08, /* 0x3e67e105ab1bda88 */ 307 1.15344768460112754160e-08, /* 0x3e48c5254d013fd0 */ 308 3.37271051945395312705e-09, /* 0x3e2cf8ab3ad62670 */ 309 2.40857608736109859459e-08, /* 0x3e59dca4bec80468 */ 310 1.85853810450623807768e-08, /* 0x3e53f4b5ec98a8da */ 311 5.14358299969225078306e-08, /* 0x3e6b9d49619d81fe */ 312 8.85023985412952486748e-09, /* 0x3e43017887460934 */ 313 1.59425154214358432060e-08, /* 0x3e511e3eca0b9944 */ 314 1.95139937737755753164e-08, /* 0x3e54f3f73c5a332e */ 315 2.64909755273544319715e-08, /* 0x3e5c71c8ae0e00a6 */ 316 4.43388037881231070144e-08, /* 0x3e67cde0f86fbdc7 */ 317 2.14757072421821274557e-08, /* 0x3e570f328c889c72 */ 318 2.61049792670754218852e-08, /* 0x3e5c07ae9b994efe */ 319 7.81439350674466302231e-09, /* 0x3e40c8021d7b1698 */ 320 3.60125207123751024094e-08, /* 0x3e635585edb8cb22 */ 321 6.15276238179343767917e-08, /* 0x3e70842567b30e96 */ 322 9.54387964641184285058e-08, /* 0x3e799e811031472e */ 323 3.02789566851502754129e-08, /* 0x3e6041821416bcee */ 324 1.16888650949870856331e-07, /* 0x3e7f6086e4dc96f4 */ 325 1.07580956468653338863e-08, /* 0x3e471a535c5f1b58 */ 326 8.33454265379535427653e-08, /* 0x3e765f743fe63ca1 */ 327 1.10790279272629526068e-07, /* 0x3e7dbd733472d014 */ 328 1.08394277896366207424e-07, /* 0x3e7d18cc4d8b0d1d */ 329 9.22176086126841098800e-08, /* 0x3e78c12553c8fb29 */ 330 7.90938592199048786990e-08, /* 0x3e753b49e2e8f991 */ 331 8.66445407164293125637e-08, /* 0x3e77422ae148c141 */ 332 1.40839973537092438671e-08, /* 0x3e4e3ec269df56a8 */ 333 1.19070438507307600689e-07, /* 0x3e7ff6754e7e0ac9 */ 334 6.40451663051716197071e-08, /* 0x3e7131267b1b5aad */ 335 1.08338682076343674522e-07, /* 0x3e7d14fa403a94bc */ 336 3.52999550187922736222e-08, /* 0x3e62f396c089a3d8 */ 337 1.05983273930043077202e-07, /* 0x3e7c731d78fa95bb */ 338 1.05486124078259553339e-07, /* 0x3e7c50f385177399 */ 339 5.82167732281776477773e-08, /* 0x3e6f41409c6f2c20 */ 340 1.08696483983403942633e-07, /* 0x3e7d2d90c4c39ec0 */ 341 4.47335086122377542835e-08, /* 0x3e680420696f2106 */ 342 1.26896287162615723528e-08, /* 0x3e4b40327943a2e8 */ 343 4.06534471589151404531e-08, /* 0x3e65d35e02f3d2a2 */ 344 3.84504846300557026690e-08, /* 0x3e64a498288117b0 */ 345 3.60715006404807269080e-08, /* 0x3e635da119afb324 */ 346 6.44725903165522722801e-08, /* 0x3e714e85cdb9a908 */ 347 3.63749249976409461305e-08, /* 0x3e638754e5547b9a */ 348 1.03901294413833913794e-07, /* 0x3e7be40ae6ce3246 */ 349 6.25379756302167880580e-08, /* 0x3e70c993b3bea7e7 */ 350 6.63984302368488828029e-08, /* 0x3e71d2dd89ac3359 */ 351 3.21844598971548278059e-08, /* 0x3e61476603332c46 */ 352 1.16030611712765830905e-07, /* 0x3e7f25901bac55b7 */ 353 1.17464622142347730134e-07, /* 0x3e7f881b7c826e28 */ 354 7.54604017965808996596e-08, /* 0x3e7441996d698d20 */ 355 1.49234929356206556899e-07, /* 0x3e8407ac521ea089 */ 356 1.41416924523217430259e-07, /* 0x3e82fb0c6c4b1723 */ 357 2.13308065617483489011e-07, /* 0x3e8ca135966a3e18 */ 358 5.04230937933302320146e-08, /* 0x3e6b1218e4d646e4 */ 359 5.45874922281655519035e-08, /* 0x3e6d4e72a350d288 */ 360 1.51849028914786868886e-07, /* 0x3e84617e2f04c329 */ 361 3.09004308703769273010e-08, /* 0x3e6096ec41e82650 */ 362 9.67574548184738317664e-08, /* 0x3e79f91f25773e6e */ 363 4.02508285529322212824e-08, /* 0x3e659c0820f1d674 */ 364 3.01222268096861091157e-08, /* 0x3e602bf7a2df1064 */ 365 2.36189860670079288680e-07, /* 0x3e8fb36bfc40508f */ 366 1.14095158111080887695e-07, /* 0x3e7ea08f3f8dc892 */ 367 7.42349089746573467487e-08, /* 0x3e73ed6254656a0e */ 368 5.12515583196230380184e-08, /* 0x3e6b83f5e5e69c58 */ 369 2.19290391828763918102e-07, /* 0x3e8d6ec2af768592 */ 370 3.83263512187553886471e-08, /* 0x3e6493889a226f94 */ 371 1.61513486284090523855e-07, /* 0x3e85ad8fa65279ba */ 372 5.09996743535589922261e-08, /* 0x3e6b615784d45434 */ 373 1.23694037861246766534e-07, /* 0x3e809a184368f145 */ 374 8.23367955351123783984e-08, /* 0x3e761a2439b0d91c */ 375 1.07591766213053694014e-07, /* 0x3e7ce1a65e39a978 */ 376 1.42789947524631815640e-07, /* 0x3e832a39a93b6a66 */ 377 1.32347123024711878538e-07, /* 0x3e81c3699af804e7 */ 378 2.17626067316598149229e-08, /* 0x3e575e0f4e44ede8 */ 379 2.34454866923044288656e-07, /* 0x3e8f77ced1a7a83b */ 380 2.82966370261766916053e-09, /* 0x3e284e7f0cb1b500 */ 381 2.29300919890907632975e-07, /* 0x3e8ec6b838b02dfe */ 382 1.48428270450261284915e-07, /* 0x3e83ebf4dfbeda87 */ 383 1.87937408574313982512e-07, /* 0x3e89397aed9cb475 */ 384 6.13685946813334055347e-08, /* 0x3e707937bc239c54 */ 385 1.98585022733583817493e-07, /* 0x3e8aa754553131b6 */ 386 7.68394131623752961662e-08, /* 0x3e74a05d407c45dc */ 387 1.28119052312436745644e-07, /* 0x3e8132231a206dd0 */ 388 7.02119104719236502733e-08, /* 0x3e72d8ecfdd69c88 */ 389 9.87954793820636301943e-08, /* 0x3e7a852c74218606 */ 390 1.72176752381034986217e-07, /* 0x3e871bf2baeebb50 */ 391 1.12877225146169704119e-08, /* 0x3e483d7db7491820 */ 392 5.33549829555851737993e-08, /* 0x3e6ca50d92b6da14 */ 393 2.13833275710816521345e-08, /* 0x3e56f5cde8530298 */ 394 1.16243518048290556393e-07, /* 0x3e7f343198910740 */ 395 6.29926408369055877943e-08, /* 0x3e70e8d241ccd80a */ 396 6.45429039328021963791e-08, /* 0x3e71535ac619e6c8 */ 397 8.64001922814281933403e-08, /* 0x3e77316041c36cd2 */ 398 9.50767572202325800240e-08, /* 0x3e7985a000637d8e */ 399 5.80851497508121135975e-08, /* 0x3e6f2f29858c0a68 */ 400 1.82350561135024766232e-07, /* 0x3e8879847f96d909 */ 401 1.98948680587390608655e-07, /* 0x3e8ab3d319e12e42 */ 402 7.83548663450197659846e-08, /* 0x3e75088162dfc4c2 */ 403 3.04374234486798594427e-08, /* 0x3e605749a1cd9d8c */ 404 2.76135725629797411787e-08, /* 0x3e5da65c6c6b8618 */ 405 4.32610105454203065470e-08, /* 0x3e6739bf7df1ad64 */ 406 5.17107515324127256994e-08, /* 0x3e6bc31252aa3340 */ 407 2.82398327875841444660e-08, /* 0x3e5e528191ad3aa8 */ 408 1.87482469524195595399e-07, /* 0x3e8929d93df19f18 */ 409 2.97481891662714096139e-08, /* 0x3e5ff11eb693a080 */ 410 9.94421570843584316402e-09, /* 0x3e455ae3f145a3a0 */ 411 1.07056210730391848428e-07, /* 0x3e7cbcd8c6c0ca82 */ 412 6.25589580466881163081e-08, /* 0x3e70cb04d425d304 */ 413 9.56641013869464593803e-08, /* 0x3e79adfcab5be678 */ 414 1.88056307148355440276e-07, /* 0x3e893d90c5662508 */ 415 8.38850689379557880950e-08, /* 0x3e768489bd35ff40 */ 416 5.01215865527674122924e-09, /* 0x3e3586ed3da2b7e0 */ 417 1.74166095998522089762e-07, /* 0x3e87604d2e850eee */ 418 9.96779574395363585849e-08, /* 0x3e7ac1d12bfb53d8 */ 419 5.98432026368321460686e-09, /* 0x3e39b3d468274740 */ 420 1.18362922366887577169e-07, /* 0x3e7fc5d68d10e53c */ 421 1.86086833284154215946e-07, /* 0x3e88f9e51884becb */ 422 1.97671457251348941011e-07, /* 0x3e8a87f0869c06d1 */ 423 1.42447160717199237159e-07, /* 0x3e831e7279f685fa */ 424 1.05504240785546574184e-08, /* 0x3e46a8282f9719b0 */ 425 3.13335218371639189324e-08, /* 0x3e60d2724a8a44e0 */ 426 1.96518418901914535399e-07, /* 0x3e8a60524b11ad4e */ 427 2.17692035039173536059e-08, /* 0x3e575fdf832750f0 */ 428 2.15613114426529981675e-07, /* 0x3e8cf06902e4cd36 */ 429 5.68271098300441214948e-08, /* 0x3e6e82422d4f6d10 */ 430 1.70331455823369124256e-08, /* 0x3e524a091063e6c0 */ 431 9.17590028095709583247e-08, /* 0x3e78a1a172dc6f38 */ 432 2.77266304112916566247e-07, /* 0x3e929b6619f8a92d */ 433 9.37041937614656939690e-08, /* 0x3e79274d9c1b70c8 */ 434 1.56116346368316796511e-08, /* 0x3e50c34b1fbb7930 */ 435 4.13967433808382727413e-08, /* 0x3e6639866c20eb50 */ 436 1.70164749185821616276e-07, /* 0x3e86d6d0f6832e9e */ 437 4.01708788545600086008e-07, /* 0x3e9af54def99f25e */ 438 2.59663539226050551563e-07, /* 0x3e916cfc52a00262 */ 439 2.22007487655027469542e-07, /* 0x3e8dcc1e83569c32 */ 440 2.90542250809644081369e-07, /* 0x3e937f7a551ed425 */ 441 4.67720537666628903341e-07, /* 0x3e9f6360adc98887 */ 442 2.79799803956772554802e-07, /* 0x3e92c6ec8d35a2c1 */ 443 2.07344552327432547723e-07, /* 0x3e8bd44df84cb036 */ 444 2.54705698692735196368e-07, /* 0x3e9117cf826e310e */ 445 4.26848589539548450728e-07, /* 0x3e9ca533f332cfc9 */ 446 2.52506723633552216197e-07, /* 0x3e90f208509dbc2e */ 447 2.14684129933849704964e-07, /* 0x3e8cd07d93c945de */ 448 3.20134822201596505431e-07, /* 0x3e957bdfd67e6d72 */ 449 9.93537565749855712134e-08, /* 0x3e7aab89c516c658 */ 450 3.70792944827917252327e-08, /* 0x3e63e823b1a1b8a0 */ 451 1.41772749369083698972e-07, /* 0x3e8307464a9d6d3c */ 452 4.22446601490198804306e-07, /* 0x3e9c5993cd438843 */ 453 4.11818433724801511540e-07, /* 0x3e9ba2fca02ab554 */ 454 1.19976381502605310519e-07, /* 0x3e801a5b6983a268 */ 455 3.43703078571520905265e-08, /* 0x3e6273d1b350efc8 */ 456 1.66128705555453270379e-07, /* 0x3e864c238c37b0c6 */ 457 5.00499610023283006540e-08, /* 0x3e6aded07370a300 */ 458 1.75105139941208062123e-07, /* 0x3e878091197eb47e */ 459 7.70807146729030327334e-08, /* 0x3e74b0f245e0dabc */ 460 2.45918607526895836121e-07, /* 0x3e9080d9794e2eaf */ 461 2.18359020958626199345e-07, /* 0x3e8d4ec242b60c76 */ 462 8.44342887976445333569e-09, /* 0x3e4221d2f940caa0 */ 463 1.07506148687888629299e-07, /* 0x3e7cdbc42b2bba5c */ 464 5.36544954316820904572e-08, /* 0x3e6cce37bb440840 */ 465 3.39109101518396596341e-07, /* 0x3e96c1d999cf1dd0 */ 466 2.60098720293920613340e-08, /* 0x3e5bed8a07eb0870 */ 467 8.42678991664621455827e-08, /* 0x3e769ed88f490e3c */ 468 5.36972237470183633197e-08, /* 0x3e6cd41719b73ef0 */ 469 4.28192558171921681288e-07, /* 0x3e9cbc4ac95b41b7 */ 470 2.71535491483955143294e-07, /* 0x3e9238f1b890f5d7 */ 471 7.84094998145075780203e-08, /* 0x3e750c4282259cc4 */ 472 3.43880599134117431863e-07, /* 0x3e9713d2de87b3e2 */ 473 1.32878065060366481043e-07, /* 0x3e81d5a7d2255276 */ 474 4.18046802627967629428e-07, /* 0x3e9c0dfd48227ac1 */ 475 2.65042411765766019424e-07, /* 0x3e91c964dab76753 */ 476 1.70383695347518643694e-07, /* 0x3e86de56d5704496 */ 477 1.54096497259613515678e-07, /* 0x3e84aeb71fd19968 */ 478 2.36543402412459813461e-07, /* 0x3e8fbf91c57b1918 */ 479 4.38416350106876736790e-07, /* 0x3e9d6bef7fbe5d9a */ 480 3.03892161339927775731e-07, /* 0x3e9464d3dc249066 */ 481 3.31136771605664899240e-07, /* 0x3e9638e2ec4d9073 */ 482 6.49494294526590682218e-08, /* 0x3e716f4a7247ea7c */ 483 4.10423429887181345747e-09, /* 0x3e31a0a740f1d440 */ 484 1.70831640869113847224e-07, /* 0x3e86edbb0114a33c */ 485 1.10811512657909180966e-07, /* 0x3e7dbee8bf1d513c */ 486 3.23677724749783611964e-07, /* 0x3e95b8bdb0248f73 */ 487 3.55662734259192678528e-07, /* 0x3e97de3d3f5eac64 */ 488 2.30102333489738219140e-07, /* 0x3e8ee24187ae448a */ 489 4.47429004000738629714e-07, /* 0x3e9e06c591ec5192 */ 490 7.78167135617329598659e-08, /* 0x3e74e3861a332738 */ 491 9.90345291908535415737e-08, /* 0x3e7a9599dcc2bfe4 */ 492 5.85800913143113728314e-08, /* 0x3e6f732fbad43468 */ 493 4.57859062410871843857e-07, /* 0x3e9eb9f573b727d9 */ 494 3.67993069723390929794e-07, /* 0x3e98b212a2eb9897 */ 495 2.90836464322977276043e-07, /* 0x3e9384884c167215 */ 496 2.51621574250131388318e-07, /* 0x3e90e2d363020051 */ 497 2.75789824740652815545e-07, /* 0x3e92820879fbd022 */ 498 3.88985776250314403593e-07, /* 0x3e9a1ab9893e4b30 */ 499 1.40214080183768019611e-07, /* 0x3e82d1b817a24478 */ 500 3.23451432223550478373e-08, /* 0x3e615d7b8ded4878 */ 501 9.15979180730608444470e-08, /* 0x3e78968f9db3a5e4 */ 502 3.44371402498640470421e-07, /* 0x3e971c4171fe135f */ 503 3.40401897215059498077e-07, /* 0x3e96d80f605d0d8c */ 504 1.06431813453707950243e-07, /* 0x3e7c91f043691590 */ 505 1.46204238932338846248e-07, /* 0x3e839f8a15fce2b2 */ 506 9.94610376972039046878e-09, /* 0x3e455beda9d94b80 */ 507 2.01711528092681771039e-07, /* 0x3e8b12c15d60949a */ 508 2.72027977986191568296e-07, /* 0x3e924167b312bfe3 */ 509 2.48402602511693757964e-07, /* 0x3e90ab8633070277 */ 510 1.58480011219249621715e-07, /* 0x3e854554ebbc80ee */ 511 3.00372828113368713281e-08, /* 0x3e60204aef5a4bb8 */ 512 3.67816204583541976394e-07, /* 0x3e98af08c679cf2c */ 513 2.46169793032343824291e-07, /* 0x3e90852a330ae6c8 */ 514 1.70080468270204253247e-07, /* 0x3e86d3eb9ec32916 */ 515 1.67806717763872914315e-07, /* 0x3e8685cb7fcbbafe */ 516 2.67715622006907942620e-07, /* 0x3e91f751c1e0bd95 */ 517 2.14411342550299170574e-08, /* 0x3e5705b1b0f72560 */ 518 4.11228221283669073277e-07, /* 0x3e9b98d8d808ca92 */ 519 3.52311752396749662260e-08, /* 0x3e62ea22c75cc980 */ 520 3.52718000397367821054e-07, /* 0x3e97aba62bca0350 */ 521 4.38857387992911129814e-07, /* 0x3e9d73833442278c */ 522 3.22574606753482540743e-07, /* 0x3e95a5ca1fb18bf9 */ 523 3.28730371182804296828e-08, /* 0x3e61a6092b6ecf28 */ 524 7.56672470607639279700e-08, /* 0x3e744fd049aac104 */ 525 3.26750155316369681821e-09, /* 0x3e2c114fd8df5180 */ 526 3.21724445362095284743e-07, /* 0x3e95972f130feae5 */ 527 1.06639427371776571151e-07, /* 0x3e7ca034a55fe198 */ 528 3.41020788139524715063e-07, /* 0x3e96e2b149990227 */ 529 1.00582838631232552824e-07, /* 0x3e7b00000294592c */ 530 3.68439433859276640065e-07, /* 0x3e98b9bdc442620e */ 531 2.20403078342388012027e-07, /* 0x3e8d94fdfabf3e4e */ 532 1.62841467098298142534e-07, /* 0x3e85db30b145ad9a */ 533 2.25325348296680733838e-07, /* 0x3e8e3e1eb95022b0 */ 534 4.37462238226421614339e-07, /* 0x3e9d5b8b45442bd6 */ 535 3.52055880555040706500e-07, /* 0x3e97a046231ecd2e */ 536 4.75614398494781776825e-07, /* 0x3e9feafe3ef55232 */ 537 3.60998399033215317516e-07, /* 0x3e9839e7bfd78267 */ 538 3.79292434611513945954e-08, /* 0x3e645cf49d6fa900 */ 539 1.29859015528549300061e-08, /* 0x3e4be3132b27f380 */ 540 3.15927546985474913188e-07, /* 0x3e9533980bb84f9f */ 541 2.28533679887379668031e-08, /* 0x3e5889e2ce3ba390 */ 542 1.17222541823553133877e-07, /* 0x3e7f7778c3ad0cc8 */ 543 1.51991208405464415857e-07, /* 0x3e846660cec4eba2 */ 544 1.56958239325240655564e-07}; /* 0x3e85110b4611a626 */ 545 546 /* Some constants and split constants. */ 547 548 static double pi = 3.1415926535897932e+00, /* 0x400921fb54442d18 */ 549 piby2 = 1.5707963267948966e+00, /* 0x3ff921fb54442d18 */ 550 piby4 = 7.8539816339744831e-01, /* 0x3fe921fb54442d18 */ 551 three_piby4 = 2.3561944901923449e+00, /* 0x4002d97c7f3321d2 */ 552 pi_head = 3.1415926218032836e+00, /* 0x400921fb50000000 */ 553 pi_tail = 3.1786509547056392e-08, /* 0x3e6110b4611a6263 */ 554 piby2_head = 1.5707963267948965e+00, /* 0x3ff921fb54442d18 */ 555 piby2_tail = 6.1232339957367660e-17; /* 0x3c91a62633145c07 */ 556 557 double u, v, vbyu, q1, q2, s, u1, vu1, u2, vu2, uu, c, r; 558 unsigned int swap_vu, index, xzero, yzero, xnan, ynan, xinf, yinf; 559 int m, xexp, yexp, diffexp; 560 561 /* Find properties of arguments x and y. */ 562 563 unsigned long long ux, ui, aux, xneg, uy, auy, yneg; 564 565 GET_BITS_DP64(x, ux); 566 GET_BITS_DP64(y, uy); 567 aux = ux & ~SIGNBIT_DP64; 568 auy = uy & ~SIGNBIT_DP64; 569 xexp = (int)((ux & EXPBITS_DP64) >> EXPSHIFTBITS_DP64); 570 yexp = (int)((uy & EXPBITS_DP64) >> EXPSHIFTBITS_DP64); 571 xneg = ux & SIGNBIT_DP64; 572 yneg = uy & SIGNBIT_DP64; 573 xzero = (aux == 0); 574 yzero = (auy == 0); 575 xnan = (aux > PINFBITPATT_DP64); 576 ynan = (auy > PINFBITPATT_DP64); 577 xinf = (aux == PINFBITPATT_DP64); 578 yinf = (auy == PINFBITPATT_DP64); 579 580 diffexp = yexp - xexp; 581 582 /* Special cases */ 583 584 if (xnan) 585 return _handle_error("atan2", OP_ATAN2, ux|0x0008000000000000, _DOMAIN, 0, 586 EDOM, x, y, 2); 587 else if (ynan) 588 return _handle_error("atan2", OP_ATAN2, uy|0x0008000000000000, _DOMAIN, 0, 589 EDOM, x, y, 2); 590 else if (yzero) 591 { /* Zero y gives +-0 for positive x 592 and +-pi for negative x */ 593 if (xneg) 594 { 595 if (yneg) return val_with_flags(-pi,AMD_F_INEXACT); 596 else return val_with_flags(pi,AMD_F_INEXACT); 597 } 598 else return y; 599 } 600 else if (xzero) 601 { /* Zero x gives +- pi/2 602 depending on sign of y */ 603 if (yneg) return val_with_flags(-piby2,AMD_F_INEXACT); 604 else val_with_flags(piby2,AMD_F_INEXACT); 605 } 606 607 /* Scale up both x and y if they are both below 1/4. 608 This avoids any possible later denormalised arithmetic. */ 609 610 if ((xexp < 1021 && yexp < 1021)) 611 { 612 scaleUpDouble1024(ux, &ux); 613 scaleUpDouble1024(uy, &uy); 614 PUT_BITS_DP64(ux, x); 615 PUT_BITS_DP64(uy, y); 616 xexp = (int)((ux & EXPBITS_DP64) >> EXPSHIFTBITS_DP64); 617 yexp = (int)((uy & EXPBITS_DP64) >> EXPSHIFTBITS_DP64); 618 diffexp = yexp - xexp; 619 } 620 621 if (diffexp > 56) 622 { /* abs(y)/abs(x) > 2^56 => arctan(x/y) 623 is insignificant compared to piby2 */ 624 if (yneg) return val_with_flags(-piby2,AMD_F_INEXACT); 625 else return val_with_flags(piby2,AMD_F_INEXACT); 626 } 627 else if (diffexp < -28 && (!xneg)) 628 { /* x positive and dominant over y by a factor of 2^28. 629 In this case atan(y/x) is y/x to machine accuracy. */ 630 631 if (diffexp < -1074) /* Result underflows */ 632 { 633 if (yneg) 634 return val_with_flags(-0.0,AMD_F_INEXACT | AMD_F_UNDERFLOW); 635 else 636 return val_with_flags(0.0,AMD_F_INEXACT | AMD_F_UNDERFLOW); 637 } 638 else 639 { 640 if (diffexp < -1022) 641 { 642 /* Result will likely be denormalized */ 643 y = scaleDouble_1(y, 100); 644 y /= x; 645 /* Now y is 2^100 times the true result. Scale it back down. */ 646 GET_BITS_DP64(y, uy); 647 scaleDownDouble(uy, 100, &uy); 648 PUT_BITS_DP64(uy, y); 649 if ((uy & EXPBITS_DP64) == 0) 650 return val_with_flags(y, AMD_F_INEXACT | AMD_F_UNDERFLOW); 651 else 652 return y; 653 } 654 else 655 return y / x; 656 } 657 } 658 else if (diffexp < -56 && xneg) 659 { /* abs(x)/abs(y) > 2^56 and x < 0 => arctan(y/x) 660 is insignificant compared to pi */ 661 if (yneg) return val_with_flags(-pi,AMD_F_INEXACT); 662 else return val_with_flags(pi,AMD_F_INEXACT); 663 } 664 else if (yinf && xinf) 665 { /* If abs(x) and abs(y) are both infinity 666 return +-pi/4 or +- 3pi/4 according to 667 signs. */ 668 if (xneg) 669 { 670 if (yneg) return val_with_flags(-three_piby4,AMD_F_INEXACT); 671 else return val_with_flags(three_piby4,AMD_F_INEXACT); 672 } 673 else 674 { 675 if (yneg) return val_with_flags(-piby4,AMD_F_INEXACT); 676 else return val_with_flags(piby4,AMD_F_INEXACT); 677 } 678 } 679 680 /* General case: take absolute values of arguments */ 681 682 u = x; v = y; 683 if (xneg) u = -x; 684 if (yneg) v = -y; 685 686 /* Swap u and v if necessary to obtain 0 < v < u. Compute v/u. */ 687 688 swap_vu = (u < v); 689 if (swap_vu) { uu = u; u = v; v = uu; } 690 vbyu = v/u; 691 692 if (vbyu > 0.0625) 693 { /* General values of v/u. Use a look-up 694 table and series expansion. */ 695 696 index = (int)(256*vbyu + 0.5); 697 q1 = atan_jby256_lead[index-16]; 698 q2 = atan_jby256_tail[index-16]; 699 c = index*1./256; 700 GET_BITS_DP64(u, ui); 701 m = (int)((ui & EXPBITS_DP64) >> EXPSHIFTBITS_DP64) - EXPBIAS_DP64; 702 u = scaleDouble_2(u,-m); 703 v = scaleDouble_2(v,-m); 704 GET_BITS_DP64(u, ui); 705 PUT_BITS_DP64(0xfffffffff8000000 & ui, u1); /* 26 leading bits of u */ 706 u2 = u - u1; 707 708 r = ((v-c*u1)-c*u2)/(u+c*v); 709 710 /* Polynomial approximation to atan(r) */ 711 712 s = r*r; 713 q2 = q2 + r - r*(s * (0.33333333333224095522 - s*(0.19999918038989143496))); 714 } 715 else if (vbyu < 1.e-8) 716 { /* v/u is small enough that atan(v/u) = v/u */ 717 q1 = 0.0; 718 q2 = vbyu; 719 } 720 else /* vbyu <= 0.0625 */ 721 { 722 /* Small values of v/u. Use a series expansion 723 computed carefully to minimise cancellation */ 724 725 GET_BITS_DP64(u, ui); 726 PUT_BITS_DP64(0xffffffff00000000 & ui, u1); 727 GET_BITS_DP64(vbyu, ui); 728 PUT_BITS_DP64(0xffffffff00000000 & ui, vu1); 729 u2 = u - u1; 730 vu2 = vbyu - vu1; 731 732 q1 = 0.0; 733 s = vbyu*vbyu; 734 q2 = vbyu + 735 ((((v - u1*vu1) - u2*vu1) - u*vu2)/u - 736 (vbyu*s*(0.33333333333333170500 - 737 s*(0.19999999999393223405 - 738 s*(0.14285713561807169030 - 739 s*(0.11110736283514525407 - 740 s*(0.90029810285449784439E-01))))))); 741 } 742 743 /* Tidy-up according to which quadrant the arguments lie in */ 744 745 if (swap_vu) {q1 = piby2_head - q1; q2 = piby2_tail - q2;} 746 if (xneg) {q1 = pi_head - q1; q2 = pi_tail - q2;} 747 q1 = q1 + q2; 748 749 if (yneg) q1 = - q1; 750 751 return q1; 752 } 753