xref: /illumos-gate/usr/src/lib/libm/common/C/atan2.c (revision 862246c1516ca78c11bef09650987f3d7171b2c9)
125c28e83SPiotr Jasiukajtis /*
225c28e83SPiotr Jasiukajtis  * CDDL HEADER START
325c28e83SPiotr Jasiukajtis  *
425c28e83SPiotr Jasiukajtis  * The contents of this file are subject to the terms of the
525c28e83SPiotr Jasiukajtis  * Common Development and Distribution License (the "License").
625c28e83SPiotr Jasiukajtis  * You may not use this file except in compliance with the License.
725c28e83SPiotr Jasiukajtis  *
825c28e83SPiotr Jasiukajtis  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
925c28e83SPiotr Jasiukajtis  * or http://www.opensolaris.org/os/licensing.
1025c28e83SPiotr Jasiukajtis  * See the License for the specific language governing permissions
1125c28e83SPiotr Jasiukajtis  * and limitations under the License.
1225c28e83SPiotr Jasiukajtis  *
1325c28e83SPiotr Jasiukajtis  * When distributing Covered Code, include this CDDL HEADER in each
1425c28e83SPiotr Jasiukajtis  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1525c28e83SPiotr Jasiukajtis  * If applicable, add the following below this CDDL HEADER, with the
1625c28e83SPiotr Jasiukajtis  * fields enclosed by brackets "[]" replaced with your own identifying
1725c28e83SPiotr Jasiukajtis  * information: Portions Copyright [yyyy] [name of copyright owner]
1825c28e83SPiotr Jasiukajtis  *
1925c28e83SPiotr Jasiukajtis  * CDDL HEADER END
2025c28e83SPiotr Jasiukajtis  */
2125c28e83SPiotr Jasiukajtis /*
2225c28e83SPiotr Jasiukajtis  * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
2325c28e83SPiotr Jasiukajtis  */
2425c28e83SPiotr Jasiukajtis /*
2525c28e83SPiotr Jasiukajtis  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
2625c28e83SPiotr Jasiukajtis  * Use is subject to license terms.
2725c28e83SPiotr Jasiukajtis  */
2825c28e83SPiotr Jasiukajtis 
29ddc0e0b5SRichard Lowe #pragma weak __atan2 = atan2
3025c28e83SPiotr Jasiukajtis 
3125c28e83SPiotr Jasiukajtis #include "libm.h"
3225c28e83SPiotr Jasiukajtis 
3325c28e83SPiotr Jasiukajtis /*
3425c28e83SPiotr Jasiukajtis  * Let t(0) = 1 and for i = 1, ..., 160, let t(i) be the slope of
3525c28e83SPiotr Jasiukajtis  * the line bisecting the conical hull of the set of points (x,y)
3625c28e83SPiotr Jasiukajtis  * where x and y are positive normal floating point numbers and
3725c28e83SPiotr Jasiukajtis  * the high order words hx and hy of their binary representations
3825c28e83SPiotr Jasiukajtis  * satisfy |hx - hy - i * 0x8000| <= 0x4000.  Then:
3925c28e83SPiotr Jasiukajtis  *
4025c28e83SPiotr Jasiukajtis  * TBL[4*i+2] is t(i) rounded to 21 significant bits (i.e., the
4125c28e83SPiotr Jasiukajtis  *   low order word is zero), and
4225c28e83SPiotr Jasiukajtis  *
4325c28e83SPiotr Jasiukajtis  * TBL[4*i] + TBL[4*i+1] form a doubled-double approximation to
4425c28e83SPiotr Jasiukajtis  *   atan(TBL[4*i+2]).
4525c28e83SPiotr Jasiukajtis  *
4625c28e83SPiotr Jasiukajtis  * Finally, TBL[4*161] = TBL[4*161+1] = TBL[4*161+2] = 0.
4725c28e83SPiotr Jasiukajtis  *
4825c28e83SPiotr Jasiukajtis  * Now for any (x,y) with 0 < y <= x and any 0 < t <= 1,  we have
4925c28e83SPiotr Jasiukajtis  * atan(y/x) = atan(t) + atan((y-t*x)/(x+t*y)).  By choosing t =
5025c28e83SPiotr Jasiukajtis  * TBL[4*i+2], where i is the multiple of 0x8000 nearest hx - hy,
5125c28e83SPiotr Jasiukajtis  * if this multiple is less than 161, and i = 161 otherwise, we
5225c28e83SPiotr Jasiukajtis  * find that |(y-t*x)/(x+t*y)| <~ 2^-5.
5325c28e83SPiotr Jasiukajtis  */
5425c28e83SPiotr Jasiukajtis static const double TBL[] = {
5525c28e83SPiotr Jasiukajtis 	7.8539816339744827900e-01, +3.0616169978683830179e-17,
5625c28e83SPiotr Jasiukajtis 	1.0000000000000000000e+00, +0,
5725c28e83SPiotr Jasiukajtis 	7.7198905126506112140e-01, +2.6989956960083153652e-16,
5825c28e83SPiotr Jasiukajtis 	9.7353506088256835938e-01, +0,
5925c28e83SPiotr Jasiukajtis 	7.6068143954461309164e-01, -3.5178810518941914972e-16,
6025c28e83SPiotr Jasiukajtis 	9.5174932479858398438e-01, +0,
6125c28e83SPiotr Jasiukajtis 	7.4953661876353638860e-01, -3.2548100004524337476e-16,
6225c28e83SPiotr Jasiukajtis 	9.3073129653930664062e-01, +0,
6325c28e83SPiotr Jasiukajtis 	7.3854614984728339522e-01, -2.0775571023910406668e-16,
6425c28e83SPiotr Jasiukajtis 	9.1042709350585937500e-01, +0,
6525c28e83SPiotr Jasiukajtis 	7.2770146962041337702e-01, +3.8883249403168348802e-16,
6625c28e83SPiotr Jasiukajtis 	8.9078664779663085938e-01, +0,
6725c28e83SPiotr Jasiukajtis 	7.1699492488093774512e-01, -4.0468841511547224071e-16,
6825c28e83SPiotr Jasiukajtis 	8.7176513671875000000e-01, +0,
6925c28e83SPiotr Jasiukajtis 	7.0641813488653149022e-01, +5.6902424353981484031e-17,
7025c28e83SPiotr Jasiukajtis 	8.5331964492797851562e-01, +0,
7125c28e83SPiotr Jasiukajtis 	6.9596351101035658360e-01, +2.8245513321075021303e-16,
7225c28e83SPiotr Jasiukajtis 	8.3541154861450195312e-01, +0,
7325c28e83SPiotr Jasiukajtis 	6.8562363680534943455e-01, -4.2316970721658854064e-16,
7425c28e83SPiotr Jasiukajtis 	8.1800508499145507812e-01, +0,
7525c28e83SPiotr Jasiukajtis 	6.7539055666438230219e-01, +4.3535917281300047233e-16,
7625c28e83SPiotr Jasiukajtis 	8.0106592178344726562e-01, +0,
7725c28e83SPiotr Jasiukajtis 	6.6525763346931832132e-01, +1.1830431602404727977e-17,
7825c28e83SPiotr Jasiukajtis 	7.8456401824951171875e-01, +0,
7925c28e83SPiotr Jasiukajtis 	6.5521767574310185722e-01, -1.7435923100651044208e-16,
8025c28e83SPiotr Jasiukajtis 	7.6847028732299804688e-01, +0,
8125c28e83SPiotr Jasiukajtis 	6.4526390999481897381e-01, -1.4741927403093983947e-16,
8225c28e83SPiotr Jasiukajtis 	7.5275802612304687500e-01, +0,
8325c28e83SPiotr Jasiukajtis 	6.3538979894204850041e-01, +1.5734535069995660853e-16,
8425c28e83SPiotr Jasiukajtis 	7.3740243911743164062e-01, +0,
8525c28e83SPiotr Jasiukajtis 	6.2558914346942717799e-01, -2.8175588856316910960e-16,
8625c28e83SPiotr Jasiukajtis 	7.2238063812255859375e-01, +0,
8725c28e83SPiotr Jasiukajtis 	6.1585586476157949676e-01, -4.3056167357725226449e-16,
8825c28e83SPiotr Jasiukajtis 	7.0767116546630859375e-01, +0,
8925c28e83SPiotr Jasiukajtis 	6.0618408027576098362e-01, +1.5018013918429320289e-16,
9025c28e83SPiotr Jasiukajtis 	6.9325399398803710938e-01, +0,
9125c28e83SPiotr Jasiukajtis 	5.9656817827486730010e-01, +5.5271942033557644157e-17,
9225c28e83SPiotr Jasiukajtis 	6.7911052703857421875e-01, +0,
9325c28e83SPiotr Jasiukajtis 	5.8700289083426504533e-01, -8.2411369282676383293e-17,
9425c28e83SPiotr Jasiukajtis 	6.6522359848022460938e-01, +0,
9525c28e83SPiotr Jasiukajtis 	5.7748303053627658699e-01, +4.9400383775709159558e-17,
9625c28e83SPiotr Jasiukajtis 	6.5157699584960937500e-01, +0,
9725c28e83SPiotr Jasiukajtis 	5.6800353968303252117e-01, +2.9924431103311109543e-16,
9825c28e83SPiotr Jasiukajtis 	6.3815546035766601562e-01, +0,
9925c28e83SPiotr Jasiukajtis 	5.5855953863493823519e-01, -2.0306003403868777403e-16,
10025c28e83SPiotr Jasiukajtis 	6.2494468688964843750e-01, +0,
10125c28e83SPiotr Jasiukajtis 	5.4914706708329674711e-01, +2.8255378613779667461e-17,
10225c28e83SPiotr Jasiukajtis 	6.1193227767944335938e-01, +0,
10325c28e83SPiotr Jasiukajtis 	5.3976176660618069292e-01, +1.6370248781078747995e-16,
10425c28e83SPiotr Jasiukajtis 	5.9910583496093750000e-01, +0,
10525c28e83SPiotr Jasiukajtis 	5.3039888601412332747e-01, -7.6196097360093680134e-17,
10625c28e83SPiotr Jasiukajtis 	5.8645296096801757812e-01, +0,
10725c28e83SPiotr Jasiukajtis 	5.2105543924318808990e-01, -2.2400815668154739561e-16,
10825c28e83SPiotr Jasiukajtis 	5.7396411895751953125e-01, +0,
10925c28e83SPiotr Jasiukajtis 	5.1172778873967050828e-01, -3.6888136019899681185e-16,
11025c28e83SPiotr Jasiukajtis 	5.6162929534912109375e-01, +0,
11125c28e83SPiotr Jasiukajtis 	5.0241199666452196482e-01, -2.5412891474397011281e-16,
11225c28e83SPiotr Jasiukajtis 	5.4943847656250000000e-01, +0,
11325c28e83SPiotr Jasiukajtis 	4.9310493954293743712e-01, +4.4132186128251152229e-16,
11425c28e83SPiotr Jasiukajtis 	5.3738307952880859375e-01, +0,
11525c28e83SPiotr Jasiukajtis 	4.8380436844750995817e-01, -2.7844387907776656488e-16,
11625c28e83SPiotr Jasiukajtis 	5.2545595169067382812e-01, +0,
11725c28e83SPiotr Jasiukajtis 	4.7450670361463753721e-01, -2.0494355197368286028e-16,
11825c28e83SPiotr Jasiukajtis 	5.1364850997924804688e-01, +0,
11925c28e83SPiotr Jasiukajtis 	4.6367660027976320691e-01, +3.1709878607954760668e-16,
12025c28e83SPiotr Jasiukajtis 	5.0003623962402343750e-01, +0,
12125c28e83SPiotr Jasiukajtis 	4.5304753104003925301e-01, +3.3593436122420574865e-16,
12225c28e83SPiotr Jasiukajtis 	4.8681926727294921875e-01, +0,
12325c28e83SPiotr Jasiukajtis 	4.4423658037407065535e-01, +2.1987183192008082015e-17,
12425c28e83SPiotr Jasiukajtis 	4.7596645355224609375e-01, +0,
12525c28e83SPiotr Jasiukajtis 	4.3567016972500294258e-01, +3.0118422805369552650e-16,
12625c28e83SPiotr Jasiukajtis 	4.6550178527832031250e-01, +0,
12725c28e83SPiotr Jasiukajtis 	4.2733152672544871820e-01, -3.2667693224866479909e-16,
12825c28e83SPiotr Jasiukajtis 	4.5539522171020507812e-01, +0,
12925c28e83SPiotr Jasiukajtis 	4.1920540176693954493e-01, -2.2454273841113897647e-16,
13025c28e83SPiotr Jasiukajtis 	4.4561982154846191406e-01, +0,
13125c28e83SPiotr Jasiukajtis 	4.1127722812701872357e-01, -3.1620568973494653391e-16,
13225c28e83SPiotr Jasiukajtis 	4.3615055084228515625e-01, +0,
13325c28e83SPiotr Jasiukajtis 	4.0353384063084263289e-01, -3.5932009901481421723e-16,
13425c28e83SPiotr Jasiukajtis 	4.2696499824523925781e-01, +0,
13525c28e83SPiotr Jasiukajtis 	3.9596319345246833166e-01, -4.0281533417458698585e-16,
13625c28e83SPiotr Jasiukajtis 	4.1804289817810058594e-01, +0,
13725c28e83SPiotr Jasiukajtis 	3.8855405220339722661e-01, +1.6132231486045176674e-16,
13825c28e83SPiotr Jasiukajtis 	4.0936565399169921875e-01, +0,
13925c28e83SPiotr Jasiukajtis 	3.8129566313738116889e-01, +1.7684657060650804570e-16,
14025c28e83SPiotr Jasiukajtis 	4.0091586112976074219e-01, +0,
14125c28e83SPiotr Jasiukajtis 	3.7417884791401867517e-01, +2.6897604227426977619e-16,
14225c28e83SPiotr Jasiukajtis 	3.9267849922180175781e-01, +0,
14325c28e83SPiotr Jasiukajtis 	3.6719421967585041955e-01, -4.5886151448673745001e-17,
14425c28e83SPiotr Jasiukajtis 	3.8463878631591796875e-01, +0,
14525c28e83SPiotr Jasiukajtis 	3.6033388248727771241e-01, +1.5804115573136074946e-16,
14625c28e83SPiotr Jasiukajtis 	3.7678408622741699219e-01, +0,
14725c28e83SPiotr Jasiukajtis 	3.5358982224579182940e-01, +1.2624619863035782939e-16,
14825c28e83SPiotr Jasiukajtis 	3.6910200119018554688e-01, +0,
14925c28e83SPiotr Jasiukajtis 	3.4695498404186952968e-01, +9.3221684607372865177e-17,
15025c28e83SPiotr Jasiukajtis 	3.6158156394958496094e-01, +0,
15125c28e83SPiotr Jasiukajtis 	3.4042268308109679964e-01, +2.7697913559445449137e-16,
15225c28e83SPiotr Jasiukajtis 	3.5421252250671386719e-01, +0,
15325c28e83SPiotr Jasiukajtis 	3.3398684598563566084e-01, +3.6085337449716011085e-16,
15425c28e83SPiotr Jasiukajtis 	3.4698557853698730469e-01, +0,
15525c28e83SPiotr Jasiukajtis 	3.2764182824591436827e-01, +2.0581506352606456186e-16,
15625c28e83SPiotr Jasiukajtis 	3.3989214897155761719e-01, +0,
15725c28e83SPiotr Jasiukajtis 	3.2138200938788497041e-01, -1.9015787485430693661e-16,
15825c28e83SPiotr Jasiukajtis 	3.3292388916015625000e-01, +0,
15925c28e83SPiotr Jasiukajtis 	3.1520245348069497737e-01, +2.6961839659264087022e-16,
16025c28e83SPiotr Jasiukajtis 	3.2607340812683105469e-01, +0,
16125c28e83SPiotr Jasiukajtis 	3.0909871873117023000e-01, -1.5641891686756272625e-16,
16225c28e83SPiotr Jasiukajtis 	3.1933403015136718750e-01, +0,
16325c28e83SPiotr Jasiukajtis 	3.0306644308947827682e-01, +2.8801634211591956223e-16,
16425c28e83SPiotr Jasiukajtis 	3.1269931793212890625e-01, +0,
16525c28e83SPiotr Jasiukajtis 	2.9710135482774191473e-01, -4.3148994478973365819e-16,
16625c28e83SPiotr Jasiukajtis 	3.0616307258605957031e-01, +0,
16725c28e83SPiotr Jasiukajtis 	2.9120015759141004708e-01, -6.8539854790808585159e-17,
16825c28e83SPiotr Jasiukajtis 	2.9972028732299804688e-01, +0,
16925c28e83SPiotr Jasiukajtis 	2.8535879880370362827e-01, -1.2231638445300492682e-16,
17025c28e83SPiotr Jasiukajtis 	2.9336524009704589844e-01, +0,
17125c28e83SPiotr Jasiukajtis 	2.7957422506893880865e-01, -4.6707752931043135528e-17,
17225c28e83SPiotr Jasiukajtis 	2.8709340095520019531e-01, +0,
17325c28e83SPiotr Jasiukajtis 	2.7384352102802367313e-01, -4.1215636366229625876e-16,
17425c28e83SPiotr Jasiukajtis 	2.8090047836303710938e-01, +0,
17525c28e83SPiotr Jasiukajtis 	2.6816369484161040049e-01, -2.3700583122400495333e-16,
17625c28e83SPiotr Jasiukajtis 	2.7478218078613281250e-01, +0,
17725c28e83SPiotr Jasiukajtis 	2.6253212627627764419e-01, +2.3123213692190889610e-16,
17825c28e83SPiotr Jasiukajtis 	2.6873469352722167969e-01, +0,
17925c28e83SPiotr Jasiukajtis 	2.5694635355759309903e-01, -4.0638513814701264145e-16,
18025c28e83SPiotr Jasiukajtis 	2.6275444030761718750e-01, +0,
18125c28e83SPiotr Jasiukajtis 	2.5140385572454615470e-01, -3.4795333793554943723e-16,
18225c28e83SPiotr Jasiukajtis 	2.5683784484863281250e-01, +0,
18325c28e83SPiotr Jasiukajtis 	2.4500357070096612233e-01, +6.6542334848010259289e-17,
18425c28e83SPiotr Jasiukajtis 	2.5002646446228027344e-01, +0,
18525c28e83SPiotr Jasiukajtis 	2.3877766609573036760e-01, -2.7756633678549343650e-16,
18625c28e83SPiotr Jasiukajtis 	2.4342155456542968750e-01, +0,
18725c28e83SPiotr Jasiukajtis 	2.3365669377188336142e-01, +3.2700803838522067998e-16,
18825c28e83SPiotr Jasiukajtis 	2.3800384998321533203e-01, +0,
18925c28e83SPiotr Jasiukajtis 	2.2870810463931334766e-01, -4.4279127662219799521e-16,
19025c28e83SPiotr Jasiukajtis 	2.3278105258941650391e-01, +0,
19125c28e83SPiotr Jasiukajtis 	2.2391820542294382790e-01, +3.7558889374284208052e-16,
19225c28e83SPiotr Jasiukajtis 	2.2773718833923339844e-01, +0,
19325c28e83SPiotr Jasiukajtis 	2.1927501815429550902e-01, -1.4829838176513811186e-16,
19425c28e83SPiotr Jasiukajtis 	2.2285830974578857422e-01, +0,
19525c28e83SPiotr Jasiukajtis 	2.1476740847367459253e-01, -2.0535381496063397578e-17,
19625c28e83SPiotr Jasiukajtis 	2.1813154220581054688e-01, +0,
19725c28e83SPiotr Jasiukajtis 	2.1038568111737454558e-01, -4.2826767738736168650e-16,
19825c28e83SPiotr Jasiukajtis 	2.1354568004608154297e-01, +0,
19925c28e83SPiotr Jasiukajtis 	2.0612057974373865221e-01, +4.2108051749502232359e-16,
20025c28e83SPiotr Jasiukajtis 	2.0909011363983154297e-01, +0,
20125c28e83SPiotr Jasiukajtis 	2.0196410359405447821e-01, +3.5157118083511092869e-16,
20225c28e83SPiotr Jasiukajtis 	2.0475566387176513672e-01, +0,
20325c28e83SPiotr Jasiukajtis 	1.9790861144712756925e-01, +3.7894950972257700994e-16,
20425c28e83SPiotr Jasiukajtis 	2.0053362846374511719e-01, +0,
20525c28e83SPiotr Jasiukajtis 	1.9394752160084305359e-01, +2.8270367403478935534e-16,
20625c28e83SPiotr Jasiukajtis 	1.9641649723052978516e-01, +0,
20725c28e83SPiotr Jasiukajtis 	1.9007440763641536563e-01, -2.0842758095683676397e-16,
20825c28e83SPiotr Jasiukajtis 	1.9239699840545654297e-01, +0,
20925c28e83SPiotr Jasiukajtis 	1.8628369629742813629e-01, +3.4710917040399448932e-16,
21025c28e83SPiotr Jasiukajtis 	1.8846881389617919922e-01, +0,
21125c28e83SPiotr Jasiukajtis 	1.8256998712939509488e-01, +1.1053834120570125251e-16,
21225c28e83SPiotr Jasiukajtis 	1.8462586402893066406e-01, +0,
21325c28e83SPiotr Jasiukajtis 	1.7892875067284830237e-01, +3.0486232913366680305e-16,
21425c28e83SPiotr Jasiukajtis 	1.8086302280426025391e-01, +0,
21525c28e83SPiotr Jasiukajtis 	1.7535529778449010507e-01, -2.3810135019970148624e-16,
21625c28e83SPiotr Jasiukajtis 	1.7717504501342773438e-01, +0,
21725c28e83SPiotr Jasiukajtis 	1.7184559192514736736e-01, +5.1432582846210893916e-17,
21825c28e83SPiotr Jasiukajtis 	1.7355740070343017578e-01, +0,
21925c28e83SPiotr Jasiukajtis 	1.6839590847744290159e-01, +3.1605623296041433586e-18,
22025c28e83SPiotr Jasiukajtis 	1.7000591754913330078e-01, +0,
22125c28e83SPiotr Jasiukajtis 	1.6500283902547518977e-01, +1.5405422268770998251e-16,
22225c28e83SPiotr Jasiukajtis 	1.6651678085327148438e-01, +0,
22325c28e83SPiotr Jasiukajtis 	1.6166306303174859949e-01, +4.0042241517254928672e-16,
22425c28e83SPiotr Jasiukajtis 	1.6308629512786865234e-01, +0,
22525c28e83SPiotr Jasiukajtis 	1.5837358268281231943e-01, -2.2786616251622967291e-16,
22625c28e83SPiotr Jasiukajtis 	1.5971112251281738281e-01, +0,
22725c28e83SPiotr Jasiukajtis 	1.5513160990288810126e-01, -3.7547723514797166336e-16,
22825c28e83SPiotr Jasiukajtis 	1.5638816356658935547e-01, +0,
22925c28e83SPiotr Jasiukajtis 	1.5193468535499299321e-01, +4.3497510505554267446e-16,
23025c28e83SPiotr Jasiukajtis 	1.5311467647552490234e-01, +0,
23125c28e83SPiotr Jasiukajtis 	1.4878033155427861089e-01, -2.3102860235324261895e-16,
23225c28e83SPiotr Jasiukajtis 	1.4988791942596435547e-01, +0,
23325c28e83SPiotr Jasiukajtis 	1.4566628729590647140e-01, +9.9227592950040279415e-17,
23425c28e83SPiotr Jasiukajtis 	1.4670538902282714844e-01, +0,
23525c28e83SPiotr Jasiukajtis 	1.4259050967286590605e-01, -3.3869909683813096906e-18,
23625c28e83SPiotr Jasiukajtis 	1.4356482028961181641e-01, +0,
23725c28e83SPiotr Jasiukajtis 	1.3955105903633846509e-01, +1.5500435650773331566e-17,
23825c28e83SPiotr Jasiukajtis 	1.4046406745910644531e-01, +0,
23925c28e83SPiotr Jasiukajtis 	1.3654610022831903393e-01, +3.3965918616682805753e-16,
24025c28e83SPiotr Jasiukajtis 	1.3740110397338867188e-01, +0,
24125c28e83SPiotr Jasiukajtis 	1.3357402082462854764e-01, +2.7572431581527535421e-16,
24225c28e83SPiotr Jasiukajtis 	1.3437414169311523438e-01, +0,
24325c28e83SPiotr Jasiukajtis 	1.3063319828908959153e-01, -3.4667213797076707331e-16,
24425c28e83SPiotr Jasiukajtis 	1.3138139247894287109e-01, +0,
24525c28e83SPiotr Jasiukajtis 	1.2772200049776749609e-01, +3.1089261947725651968e-16,
24625c28e83SPiotr Jasiukajtis 	1.2842106819152832031e-01, +0,
24725c28e83SPiotr Jasiukajtis 	1.2436931430778752627e-01, -4.0654251891464630059e-16,
24825c28e83SPiotr Jasiukajtis 	1.2501454353332519531e-01, +0,
24925c28e83SPiotr Jasiukajtis 	1.2111683701666819957e-01, -3.9381654342464836012e-16,
25025c28e83SPiotr Jasiukajtis 	1.2171256542205810547e-01, +0,
25125c28e83SPiotr Jasiukajtis 	1.1844801833536511282e-01, -3.6673155595150283444e-16,
25225c28e83SPiotr Jasiukajtis 	1.1900508403778076172e-01, +0,
25325c28e83SPiotr Jasiukajtis 	1.1587365536613614125e-01, -1.5026628801318421951e-16,
25425c28e83SPiotr Jasiukajtis 	1.1639505624771118164e-01, +0,
25525c28e83SPiotr Jasiukajtis 	1.1338607085741525538e-01, +1.2886806274050538880e-16,
25625c28e83SPiotr Jasiukajtis 	1.1387449502944946289e-01, +0,
25725c28e83SPiotr Jasiukajtis 	1.1097844020819369604e-01, +2.3848343623577768044e-16,
25825c28e83SPiotr Jasiukajtis 	1.1143630743026733398e-01, +0,
25925c28e83SPiotr Jasiukajtis 	1.0864456107308662069e-01, +4.2065430313285469408e-16,
26025c28e83SPiotr Jasiukajtis 	1.0907405614852905273e-01, +0,
26125c28e83SPiotr Jasiukajtis 	1.0637891628473727934e-01, -4.6883543790348472687e-18,
26225c28e83SPiotr Jasiukajtis 	1.0678201913833618164e-01, +0,
26325c28e83SPiotr Jasiukajtis 	1.0417650062205296990e-01, +1.4774925414624453292e-16,
26425c28e83SPiotr Jasiukajtis 	1.0455501079559326172e-01, +0,
26525c28e83SPiotr Jasiukajtis 	1.0203276464730581807e-01, -1.5677032794816452332e-16,
26625c28e83SPiotr Jasiukajtis 	1.0238832235336303711e-01, +0,
26725c28e83SPiotr Jasiukajtis 	9.9943617083734892503e-02, +3.4511310907979792828e-16,
26825c28e83SPiotr Jasiukajtis 	1.0027772188186645508e-01, +0,
26925c28e83SPiotr Jasiukajtis 	9.7905249824711049200e-02, +3.4489485563461708496e-16,
27025c28e83SPiotr Jasiukajtis 	9.8219275474548339844e-02, +0,
27125c28e83SPiotr Jasiukajtis 	9.5914316649349906641e-02, -1.3214510886789011569e-17,
27225c28e83SPiotr Jasiukajtis 	9.6209526062011718750e-02, +0,
27325c28e83SPiotr Jasiukajtis 	9.3967698614664918466e-02, +1.1048427091217964090e-16,
27425c28e83SPiotr Jasiukajtis 	9.4245254993438720703e-02, +0,
27525c28e83SPiotr Jasiukajtis 	9.2062564267554769515e-02, -3.7297463814697759309e-16,
27625c28e83SPiotr Jasiukajtis 	9.2323541641235351562e-02, +0,
27725c28e83SPiotr Jasiukajtis 	9.0196252506350660383e-02, -3.5280143043576718079e-16,
27825c28e83SPiotr Jasiukajtis 	9.0441644191741943359e-02, +0,
27925c28e83SPiotr Jasiukajtis 	8.8366391663268650802e-02, -6.1140673227541621183e-17,
28025c28e83SPiotr Jasiukajtis 	8.8597118854522705078e-02, +0,
28125c28e83SPiotr Jasiukajtis 	8.6570782100201526532e-02, -2.0998844594957629702e-16,
28225c28e83SPiotr Jasiukajtis 	8.6787700653076171875e-02, +0,
28325c28e83SPiotr Jasiukajtis 	8.4807337678923566671e-02, +3.9530981588194673068e-16,
28425c28e83SPiotr Jasiukajtis 	8.5011243820190429688e-02, +0,
28525c28e83SPiotr Jasiukajtis 	8.3074323040850828193e-02, -4.3022503210464894539e-17,
28625c28e83SPiotr Jasiukajtis 	8.3265960216522216797e-02, +0,
28725c28e83SPiotr Jasiukajtis 	8.1369880712663267275e-02, -6.3063867569127169744e-18,
28825c28e83SPiotr Jasiukajtis 	8.1549942493438720703e-02, +0,
28925c28e83SPiotr Jasiukajtis 	7.9692445771216036121e-02, -5.0787623072962671502e-17,
29025c28e83SPiotr Jasiukajtis 	7.9861581325531005859e-02, +0,
29125c28e83SPiotr Jasiukajtis 	7.8040568735575632786e-02, -3.8810063021216721741e-16,
29225c28e83SPiotr Jasiukajtis 	7.8199386596679687500e-02, +0,
29325c28e83SPiotr Jasiukajtis 	7.6412797391314235540e-02, +4.1246529500495762995e-16,
29425c28e83SPiotr Jasiukajtis 	7.6561868190765380859e-02, +0,
29525c28e83SPiotr Jasiukajtis 	7.4807854772808823896e-02, -3.7025599052186724156e-16,
29625c28e83SPiotr Jasiukajtis 	7.4947714805603027344e-02, +0,
29725c28e83SPiotr Jasiukajtis 	7.3224639528778112663e-02, +4.2209138483206712401e-17,
29825c28e83SPiotr Jasiukajtis 	7.3355793952941894531e-02, +0,
29925c28e83SPiotr Jasiukajtis 	7.1661929761571485642e-02, -3.2074473649855177622e-16,
30025c28e83SPiotr Jasiukajtis 	7.1784853935241699219e-02, +0,
30125c28e83SPiotr Jasiukajtis 	7.0118738881148168218e-02, -2.5371257235753296804e-16,
30225c28e83SPiotr Jasiukajtis 	7.0233881473541259766e-02, +0,
30325c28e83SPiotr Jasiukajtis 	6.8594137996416115755e-02, +3.3796987842548399135e-16,
30425c28e83SPiotr Jasiukajtis 	6.8701922893524169922e-02, +0,
30525c28e83SPiotr Jasiukajtis 	6.7087137393172291411e-02, +5.5061492696328852397e-17,
30625c28e83SPiotr Jasiukajtis 	6.7187964916229248047e-02, +0,
30725c28e83SPiotr Jasiukajtis 	6.5596983299946565182e-02, -2.1580863111502565280e-16,
30825c28e83SPiotr Jasiukajtis 	6.5691232681274414062e-02, +0,
30925c28e83SPiotr Jasiukajtis 	6.4122802037412718335e-02, -3.1315661827469233434e-16,
31025c28e83SPiotr Jasiukajtis 	6.4210832118988037109e-02, +0,
31125c28e83SPiotr Jasiukajtis 	6.2426231582525915087e-02, -2.5758980071296622188e-16,
31225c28e83SPiotr Jasiukajtis 	6.2507450580596923828e-02, +0,
31325c28e83SPiotr Jasiukajtis 	6.0781559928021700046e-02, +1.3736899336217710591e-16,
31425c28e83SPiotr Jasiukajtis 	6.0856521129608154297e-02, +0,
31525c28e83SPiotr Jasiukajtis 	5.9432882624005145544e-02, +2.2246097394328856474e-16,
31625c28e83SPiotr Jasiukajtis 	5.9502959251403808594e-02, +0,
31725c28e83SPiotr Jasiukajtis 	5.8132551274581167888e-02, -6.2525053236379489390e-18,
31825c28e83SPiotr Jasiukajtis 	5.8198124170303344727e-02, +0,
31925c28e83SPiotr Jasiukajtis 	5.6876611930681164608e-02, -2.6589930995607417149e-16,
32025c28e83SPiotr Jasiukajtis 	5.6938022375106811523e-02, +0,
32125c28e83SPiotr Jasiukajtis 	5.5661522654748551986e-02, -4.2736362859832186197e-16,
32225c28e83SPiotr Jasiukajtis 	5.5719077587127685547e-02, +0,
32325c28e83SPiotr Jasiukajtis 	5.4484124463757943602e-02, -1.6708067365310384253e-16,
32425c28e83SPiotr Jasiukajtis 	5.4538100957870483398e-02, +0,
32525c28e83SPiotr Jasiukajtis 	5.3341582449436764080e-02, +3.3271673004611311850e-17,
32625c28e83SPiotr Jasiukajtis 	5.3392231464385986328e-02, +0,
32725c28e83SPiotr Jasiukajtis 	5.2231267345892007370e-02, -3.5593396674200571616e-16,
32825c28e83SPiotr Jasiukajtis 	5.2278816699981689453e-02, +0,
32925c28e83SPiotr Jasiukajtis 	5.1150874758829623090e-02, +1.4432815841187114832e-16,
33025c28e83SPiotr Jasiukajtis 	5.1195532083511352539e-02, +0,
33125c28e83SPiotr Jasiukajtis 	5.0098306612679444072e-02, +9.4680943793589404083e-17,
33225c28e83SPiotr Jasiukajtis 	5.0140261650085449219e-02, +0,
33325c28e83SPiotr Jasiukajtis 	4.9071641675614507960e-02, +2.1131168520301896817e-16,
33425c28e83SPiotr Jasiukajtis 	4.9111068248748779297e-02, +0,
33525c28e83SPiotr Jasiukajtis 	4.8069135772851545596e-02, +1.6035336741307516296e-16,
33625c28e83SPiotr Jasiukajtis 	4.8106193542480468750e-02, +0,
33725c28e83SPiotr Jasiukajtis 	4.7089192241088539959e-02, -2.2491738698796901479e-16,
33825c28e83SPiotr Jasiukajtis 	4.7124028205871582031e-02, +0,
33925c28e83SPiotr Jasiukajtis 	4.6130362086062248750e-02, -1.5111423469578965206e-16,
34025c28e83SPiotr Jasiukajtis 	4.6163111925125122070e-02, +0,
34125c28e83SPiotr Jasiukajtis 	4.5191314382707403752e-02, +4.1989325207399786612e-16,
34225c28e83SPiotr Jasiukajtis 	4.5222103595733642578e-02, +0,
34325c28e83SPiotr Jasiukajtis 	4.4270836390474244126e-02, -4.1432635292331004454e-16,
34425c28e83SPiotr Jasiukajtis 	4.4299781322479248047e-02, +0,
34525c28e83SPiotr Jasiukajtis 	4.3367774164955186222e-02, -3.0615383054587355892e-16,
34625c28e83SPiotr Jasiukajtis 	4.3394982814788818359e-02, +0,
34725c28e83SPiotr Jasiukajtis 	4.2481121875321825598e-02, -3.6730166956273555173e-16,
34825c28e83SPiotr Jasiukajtis 	4.2506694793701171875e-02, +0,
34925c28e83SPiotr Jasiukajtis 	4.1609902899457651415e-02, -4.4226425958068821782e-16,
35025c28e83SPiotr Jasiukajtis 	4.1633933782577514648e-02, +0,
35125c28e83SPiotr Jasiukajtis 	4.0753259129372665370e-02, +1.9801161516527046872e-16,
35225c28e83SPiotr Jasiukajtis 	4.0775835514068603516e-02, +0,
35325c28e83SPiotr Jasiukajtis 	3.9910361780060910064e-02, +8.2560620036613164573e-18,
35425c28e83SPiotr Jasiukajtis 	3.9931565523147583008e-02, +0,
35525c28e83SPiotr Jasiukajtis 	3.9080441183869218946e-02, +3.9908991939242971628e-17,
35625c28e83SPiotr Jasiukajtis 	3.9100348949432373047e-02, +0,
35725c28e83SPiotr Jasiukajtis 	3.8262816593271686827e-02, +9.5182237812195590276e-17,
35825c28e83SPiotr Jasiukajtis 	3.8281500339508056641e-02, +0,
35925c28e83SPiotr Jasiukajtis 	3.7456806948784837630e-02, +1.5213508760679563439e-16,
36025c28e83SPiotr Jasiukajtis 	3.7474334239959716797e-02, +0,
36125c28e83SPiotr Jasiukajtis 	3.6661849947035918262e-02, +7.3335516005184616486e-17,
36225c28e83SPiotr Jasiukajtis 	3.6678284406661987305e-02, +0,
36325c28e83SPiotr Jasiukajtis 	3.5877353272533163420e-02, -1.3007348019891714540e-16,
36425c28e83SPiotr Jasiukajtis 	3.5892754793167114258e-02, +0,
36525c28e83SPiotr Jasiukajtis 	3.5102754135096780885e-02, -2.9903662298950558656e-16,
36625c28e83SPiotr Jasiukajtis 	3.5117179155349731445e-02, +0,
36725c28e83SPiotr Jasiukajtis 	3.4337638360670830195e-02, +2.9656295131966114331e-16,
36825c28e83SPiotr Jasiukajtis 	3.4351140260696411133e-02, +0,
36925c28e83SPiotr Jasiukajtis 	3.3581472523789734907e-02, +3.4810947205572817820e-16,
37025c28e83SPiotr Jasiukajtis 	3.3594101667404174805e-02, +0,
37125c28e83SPiotr Jasiukajtis 	3.2833871859357266487e-02, -3.8885440174405159838e-16,
37225c28e83SPiotr Jasiukajtis 	3.2845675945281982422e-02, +0,
37325c28e83SPiotr Jasiukajtis 	3.2094421679560447558e-02, +5.8805134853032009978e-17,
37425c28e83SPiotr Jasiukajtis 	3.2105445861816406250e-02, +0,
37525c28e83SPiotr Jasiukajtis 	3.1243584858944295490e-02, +2.8737383773884313066e-17,
37625c28e83SPiotr Jasiukajtis 	3.1253755092620849609e-02, +0,
37725c28e83SPiotr Jasiukajtis 	0, 0, 0, 0
37825c28e83SPiotr Jasiukajtis };
37925c28e83SPiotr Jasiukajtis 
38025c28e83SPiotr Jasiukajtis static const double C[] = {
38125c28e83SPiotr Jasiukajtis 	0.0,
38225c28e83SPiotr Jasiukajtis 	0.125,
38325c28e83SPiotr Jasiukajtis 	1.2980742146337069071e+33,
38425c28e83SPiotr Jasiukajtis 	7.8539816339744827900e-01,
38525c28e83SPiotr Jasiukajtis 	1.5707963267948965580e+00,
38625c28e83SPiotr Jasiukajtis 	6.1232339957367658860e-17,
38725c28e83SPiotr Jasiukajtis 	-3.1415926535897931160e+00,
38825c28e83SPiotr Jasiukajtis 	-1.2246467991473531772e-16,
38925c28e83SPiotr Jasiukajtis 	-3.33333333333327571893331786354179101074860633009e-0001,
39025c28e83SPiotr Jasiukajtis 	+1.99999999942671624230086497610394721817438631379e-0001,
39125c28e83SPiotr Jasiukajtis 	-1.42856965565428636896183013324727205980484158356e-0001,
39225c28e83SPiotr Jasiukajtis 	+1.10894981496317081405107718475040168084164825641e-0001,
39325c28e83SPiotr Jasiukajtis };
39425c28e83SPiotr Jasiukajtis 
39525c28e83SPiotr Jasiukajtis #define	zero	C[0]
39625c28e83SPiotr Jasiukajtis #define	twom3	C[1]
39725c28e83SPiotr Jasiukajtis #define	two110	C[2]
39825c28e83SPiotr Jasiukajtis #define	pio4	C[3]
39925c28e83SPiotr Jasiukajtis #define	pio2	C[4]
40025c28e83SPiotr Jasiukajtis #define	pio2_lo	C[5]
40125c28e83SPiotr Jasiukajtis #define	mpi	C[6]
40225c28e83SPiotr Jasiukajtis #define	mpi_lo	C[7]
40325c28e83SPiotr Jasiukajtis #define	p1	C[8]
40425c28e83SPiotr Jasiukajtis #define	p2	C[9]
40525c28e83SPiotr Jasiukajtis #define	p3	C[10]
40625c28e83SPiotr Jasiukajtis #define	p4	C[11]
40725c28e83SPiotr Jasiukajtis 
40825c28e83SPiotr Jasiukajtis double
atan2(double oy,double ox)40925c28e83SPiotr Jasiukajtis atan2(double oy, double ox) {
41025c28e83SPiotr Jasiukajtis 	double	ah, al, t, xh, x, y, z;
41125c28e83SPiotr Jasiukajtis 	int	i, k, hx, hy, sx, sy;
41225c28e83SPiotr Jasiukajtis #ifndef lint
413*862246c1SToomas Soome 	volatile int	inexact __unused;
41425c28e83SPiotr Jasiukajtis #endif
41525c28e83SPiotr Jasiukajtis 
41625c28e83SPiotr Jasiukajtis 	hy = ((int *)&oy)[HIWORD];
41725c28e83SPiotr Jasiukajtis 	sy = hy & 0x80000000;
41825c28e83SPiotr Jasiukajtis 	hy &= ~0x80000000;
41925c28e83SPiotr Jasiukajtis 
42025c28e83SPiotr Jasiukajtis 	hx = ((int *)&ox)[HIWORD];
42125c28e83SPiotr Jasiukajtis 	sx = hx & 0x80000000;
42225c28e83SPiotr Jasiukajtis 	hx &= ~0x80000000;
42325c28e83SPiotr Jasiukajtis 
42425c28e83SPiotr Jasiukajtis 	if (hy > hx || (hy == hx && ((unsigned *)&oy)[LOWORD] >
42525c28e83SPiotr Jasiukajtis 	    ((unsigned *)&ox)[LOWORD])) {
42625c28e83SPiotr Jasiukajtis 		i = hx;
42725c28e83SPiotr Jasiukajtis 		hx = hy;
42825c28e83SPiotr Jasiukajtis 		hy = i;
42925c28e83SPiotr Jasiukajtis 		x = fabs(oy);
43025c28e83SPiotr Jasiukajtis 		y = fabs(ox);
43125c28e83SPiotr Jasiukajtis 		if (sx) {
43225c28e83SPiotr Jasiukajtis 			ah = pio2;
43325c28e83SPiotr Jasiukajtis 			al = pio2_lo;
43425c28e83SPiotr Jasiukajtis 		} else {
43525c28e83SPiotr Jasiukajtis 			ah = -pio2;
43625c28e83SPiotr Jasiukajtis 			al = -pio2_lo;
43725c28e83SPiotr Jasiukajtis 			sy ^= 0x80000000;
43825c28e83SPiotr Jasiukajtis 		}
43925c28e83SPiotr Jasiukajtis 	} else {
44025c28e83SPiotr Jasiukajtis 		x = fabs(ox);
44125c28e83SPiotr Jasiukajtis 		y = fabs(oy);
44225c28e83SPiotr Jasiukajtis 		if (sx) {
44325c28e83SPiotr Jasiukajtis 			ah = mpi;
44425c28e83SPiotr Jasiukajtis 			al = mpi_lo;
44525c28e83SPiotr Jasiukajtis 			sy ^= 0x80000000;
44625c28e83SPiotr Jasiukajtis 		} else {
44725c28e83SPiotr Jasiukajtis 			ah = al = zero;
44825c28e83SPiotr Jasiukajtis 		}
44925c28e83SPiotr Jasiukajtis 	}
45025c28e83SPiotr Jasiukajtis 
45125c28e83SPiotr Jasiukajtis 	if (hx >= 0x7fe00000 || hx - hy >= 0x03600000) {
45225c28e83SPiotr Jasiukajtis 		if (hx >= 0x7ff00000) {
45325c28e83SPiotr Jasiukajtis 			if (((hx ^ 0x7ff00000) | ((int *)&x)[LOWORD]) != 0)
45425c28e83SPiotr Jasiukajtis 				return (ox * oy);
45525c28e83SPiotr Jasiukajtis 			if (hy >= 0x7ff00000)
45625c28e83SPiotr Jasiukajtis 				ah += pio4;
45725c28e83SPiotr Jasiukajtis #ifndef lint
45825c28e83SPiotr Jasiukajtis 			inexact = (int)ah;	/* inexact if ah != 0 */
45925c28e83SPiotr Jasiukajtis #endif
46025c28e83SPiotr Jasiukajtis 			return ((sy)? -ah : ah);
46125c28e83SPiotr Jasiukajtis 		}
46225c28e83SPiotr Jasiukajtis 		if (hx - hy >= 0x03600000) {
46325c28e83SPiotr Jasiukajtis 			if ((int)ah == 0)
46425c28e83SPiotr Jasiukajtis 				ah = y / x;
46525c28e83SPiotr Jasiukajtis 			return ((sy)? -ah : ah);
46625c28e83SPiotr Jasiukajtis 		}
46725c28e83SPiotr Jasiukajtis 		y *= twom3;
46825c28e83SPiotr Jasiukajtis 		x *= twom3;
46925c28e83SPiotr Jasiukajtis 		hy -= 0x00300000;
47025c28e83SPiotr Jasiukajtis 		hx -= 0x00300000;
47125c28e83SPiotr Jasiukajtis 	} else if (hy < 0x00100000) {
47225c28e83SPiotr Jasiukajtis 		if ((hy | ((int *)&y)[LOWORD]) == 0) {
47325c28e83SPiotr Jasiukajtis 			if ((hx | ((int *)&x)[LOWORD]) == 0)
47425c28e83SPiotr Jasiukajtis 				return (_SVID_libm_err(ox, oy, 3));
47525c28e83SPiotr Jasiukajtis #ifndef lint
47625c28e83SPiotr Jasiukajtis 			inexact = (int)ah;	/* inexact if ah != 0 */
47725c28e83SPiotr Jasiukajtis #endif
47825c28e83SPiotr Jasiukajtis 			return ((sy)? -ah : ah);
47925c28e83SPiotr Jasiukajtis 		}
48025c28e83SPiotr Jasiukajtis 		y *= two110;
48125c28e83SPiotr Jasiukajtis 		x *= two110;
48225c28e83SPiotr Jasiukajtis 		hy = ((int *)&y)[HIWORD];
48325c28e83SPiotr Jasiukajtis 		hx = ((int *)&x)[HIWORD];
48425c28e83SPiotr Jasiukajtis 	}
48525c28e83SPiotr Jasiukajtis 
48625c28e83SPiotr Jasiukajtis 	k = (((hx - hy) + 0x00004000) >> 13) & ~0x3;
48725c28e83SPiotr Jasiukajtis 	if (k > 644)
48825c28e83SPiotr Jasiukajtis 		k = 644;
48925c28e83SPiotr Jasiukajtis 	ah += TBL[k];
49025c28e83SPiotr Jasiukajtis 	al += TBL[k+1];
49125c28e83SPiotr Jasiukajtis 	t = TBL[k+2];
49225c28e83SPiotr Jasiukajtis 
49325c28e83SPiotr Jasiukajtis 	xh = x;
49425c28e83SPiotr Jasiukajtis 	((int *)&xh)[LOWORD] = 0;
49525c28e83SPiotr Jasiukajtis 	z = ((y - t * xh) - t * (x - xh)) / (x + y * t);
49625c28e83SPiotr Jasiukajtis 	x = z * z;
49725c28e83SPiotr Jasiukajtis 	t = ah + (z + (al + (z * x) * (p1 + x * (p2 + x * (p3 + x * p4)))));
49825c28e83SPiotr Jasiukajtis 	return ((sy)? -t : t);
49925c28e83SPiotr Jasiukajtis }
500