Print this page
11210 libm should be cstyle(1ONBLD) clean
Split |
Close |
Expand all |
Collapse all |
--- old/usr/src/lib/libm/common/Q/atan2l.c
+++ new/usr/src/lib/libm/common/Q/atan2l.c
1 1 /*
2 2 * CDDL HEADER START
3 3 *
4 4 * The contents of this file are subject to the terms of the
5 5 * Common Development and Distribution License (the "License").
6 6 * You may not use this file except in compliance with the License.
7 7 *
8 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 9 * or http://www.opensolaris.org/os/licensing.
10 10 * See the License for the specific language governing permissions
11 11 * and limitations under the License.
12 12 *
13 13 * When distributing Covered Code, include this CDDL HEADER in each
14 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
↓ open down ↓ |
14 lines elided |
↑ open up ↑ |
15 15 * If applicable, add the following below this CDDL HEADER, with the
16 16 * fields enclosed by brackets "[]" replaced with your own identifying
17 17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 18 *
19 19 * CDDL HEADER END
20 20 */
21 21
22 22 /*
23 23 * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
24 24 */
25 +
25 26 /*
26 27 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
27 28 * Use is subject to license terms.
28 29 */
29 30
30 31 /*
31 32 * atan2l(y,x)
32 33 *
33 34 * Method :
34 35 * 1. Reduce y to positive by atan2(y,x)=-atan2(-y,x).
35 36 * 2. Reduce x to positive by (if x and y are unexceptional):
36 37 * ARG (x+iy) = arctan(y/x) ... if x > 0,
37 38 * ARG (x+iy) = pi - arctan[y/(-x)] ... if x < 0,
38 39 *
39 40 * Special cases:
40 41 *
41 42 * ATAN2((anything), NaN ) is NaN;
42 43 * ATAN2(NAN , (anything) ) is NaN;
43 44 * ATAN2(+-0, +(anything but NaN)) is +-0 ;
44 45 * ATAN2(+-0, -(anything but NaN)) is +-PI ;
45 46 * ATAN2(+-(anything but 0 and NaN), 0) is +-PI/2;
46 47 * ATAN2(+-(anything but INF and NaN), +INF) is +-0 ;
47 48 * ATAN2(+-(anything but INF and NaN), -INF) is +-PI;
48 49 * ATAN2(+-INF,+INF ) is +-PI/4 ;
49 50 * ATAN2(+-INF,-INF ) is +-3PI/4;
50 51 * ATAN2(+-INF, (anything but,0,NaN, and INF)) is +-PI/2;
51 52 *
52 53 * Constants:
53 54 * The hexadecimal values are the intended ones for the following constants.
↓ open down ↓ |
19 lines elided |
↑ open up ↑ |
54 55 * The decimal values may be used, provided that the compiler will convert
55 56 * from decimal to binary accurately enough to produce the hexadecimal values
56 57 * shown.
57 58 */
58 59
59 60 #pragma weak __atan2l = atan2l
60 61
61 62 #include "libm.h"
62 63 #include "longdouble.h"
63 64
64 -static const long double
65 - zero = 0.0L,
66 - tiny = 1.0e-40L,
67 - one = 1.0L,
68 - half = 0.5L,
69 - PI3o4 = 2.356194490192344928846982537459627163148L,
70 - PIo4 = 0.785398163397448309615660845819875721049L,
71 - PIo2 = 1.570796326794896619231321691639751442099L,
72 - PI = 3.141592653589793238462643383279502884197L,
73 - PI_lo = 8.671810130123781024797044026043351968762e-35L;
65 +static const long double zero = 0.0L,
66 + tiny = 1.0e-40L,
67 + one = 1.0L,
68 + half = 0.5L,
69 + PI3o4 = 2.356194490192344928846982537459627163148L,
70 + PIo4 = 0.785398163397448309615660845819875721049L,
71 + PIo2 = 1.570796326794896619231321691639751442099L,
72 + PI = 3.141592653589793238462643383279502884197L,
73 + PI_lo = 8.671810130123781024797044026043351968762e-35L;
74 74
75 75 long double
76 76 atan2l(long double y, long double x)
77 77 {
78 78 long double t, z;
79 79 int k, m, signy, signx;
80 80
81 81 if (x != x || y != y)
82 - return (x + y); /* return NaN if x or y is NAN */
82 + return (x + y); /* return NaN if x or y is NAN */
83 +
83 84 signy = signbitl(y);
84 85 signx = signbitl(x);
86 +
85 87 if (x == one)
86 88 return (atanl(y));
89 +
87 90 /* Ensure sign indicators are boolean */
88 91 m = (signy != 0) + (signx != 0) + (signx != 0);
89 92
90 93 /* when y = 0 */
91 - if (y == zero)
94 + if (y == zero) {
92 95 switch (m) {
93 96 case 0:
94 - return (y); /* atan(+0,+anything) */
97 + return (y); /* atan(+0,+anything) */
95 98 case 1:
96 - return (y); /* atan(-0,+anything) */
99 + return (y); /* atan(-0,+anything) */
97 100 case 2:
98 101 return (PI + tiny); /* atan(+0,-anything) */
99 102 case 3:
100 103 return (-PI - tiny); /* atan(-0,-anything) */
101 104 }
105 + }
102 106
103 107 /* when x = 0 */
104 108 if (x == zero)
105 109 return (signy != 0 ? -PIo2 - tiny : PIo2 + tiny);
106 110
107 111 /* when x is INF */
108 112 if (!finitel(x)) {
109 113 if (!finitel(y)) {
110 114 switch (m) {
111 115 case 0:
112 116 return (PIo4 + tiny); /* atan(+INF,+INF) */
↓ open down ↓ |
1 lines elided |
↑ open up ↑ |
113 117 case 1:
114 118 return (-PIo4 - tiny); /* atan(-INF,+INF) */
115 119 case 2:
116 120 return (PI3o4 + tiny); /* atan(+INF,-INF) */
117 121 case 3:
118 122 return (-PI3o4 - tiny); /* atan(-INF,-INF) */
119 123 }
120 124 } else {
121 125 switch (m) {
122 126 case 0:
123 - return (zero); /* atan(+...,+INF) */
127 + return (zero); /* atan(+...,+INF) */
124 128 case 1:
125 - return (-zero); /* atan(-...,+INF) */
129 + return (-zero); /* atan(-...,+INF) */
126 130 case 2:
127 131 return (PI + tiny); /* atan(+...,-INF) */
128 132 case 3:
129 133 return (-PI - tiny); /* atan(-...,-INF) */
130 134 }
131 135 }
132 136 }
137 +
133 138 /* when y is INF */
134 139 if (!finitel(y))
135 140 return (signy != 0 ? -PIo2 - tiny : PIo2 + tiny);
136 141
137 142 /* compute y/x */
138 143 x = fabsl(x);
139 144 y = fabsl(y);
140 145 t = PI_lo;
141 146 k = (ilogbl(y) - ilogbl(x));
142 147
143 148 if (k > 120)
144 149 z = PIo2 + half * t;
145 150 else if (m > 1 && k < -120)
146 151 z = zero;
147 152 else
148 153 z = atanl(y / x);
149 154
150 155 switch (m) {
151 156 case 0:
152 - return (z); /* atan(+,+) */
157 + return (z); /* atan(+,+) */
153 158 case 1:
154 - return (-z); /* atan(-,+) */
159 + return (-z); /* atan(-,+) */
155 160 case 2:
156 161 return (PI - (z - t)); /* atan(+,-) */
157 162 case 3:
158 163 return ((z - t) - PI); /* atan(-,-) */
159 164 }
165 +
160 166 /* NOTREACHED */
161 167 return (0.0L);
162 168 }
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX