80
89
if (u<A) { /* u < A */
82
91
else { /* A <= u < B */
83
v=x*x; yy=x*v*(d3.d+v*(d5.d+v*(d7.d+v*(d9.d+v*(d11.d+v*d13.d)))));
84
if ((y=x+(yy-U1*x)) == x+(yy+U1*x)) return y;
86
EMULV(x,x,v,vv,t1,t2,t3,t4,t5) /* v+vv=x^2 */
87
s1=v*(f11.d+v*(f13.d+v*(f15.d+v*(f17.d+v*f19.d))));
88
ADD2(f9.d,ff9.d,s1,ZERO,s2,ss2,t1,t2)
89
MUL2(v,vv,s2,ss2,s1,ss1,t1,t2,t3,t4,t5,t6,t7,t8)
90
ADD2(f7.d,ff7.d,s1,ss1,s2,ss2,t1,t2)
91
MUL2(v,vv,s2,ss2,s1,ss1,t1,t2,t3,t4,t5,t6,t7,t8)
92
ADD2(f5.d,ff5.d,s1,ss1,s2,ss2,t1,t2)
93
MUL2(v,vv,s2,ss2,s1,ss1,t1,t2,t3,t4,t5,t6,t7,t8)
94
ADD2(f3.d,ff3.d,s1,ss1,s2,ss2,t1,t2)
95
MUL2(v,vv,s2,ss2,s1,ss1,t1,t2,t3,t4,t5,t6,t7,t8)
96
MUL2(x,ZERO,s1,ss1,s2,ss2,t1,t2,t3,t4,t5,t6,t7,t8)
97
ADD2(x,ZERO,s2,ss2,s1,ss1,t1,t2)
98
if ((y=s1+(ss1-U5*s1)) == s1+(ss1+U5*s1)) return y;
92
v=x*x; yy=x*v*(d3.d+v*(d5.d+v*(d7.d+v*(d9.d+v*(d11.d+v*d13.d)))));
93
if ((y=x+(yy-U1*x)) == x+(yy+U1*x)) return y;
95
EMULV(x,x,v,vv,t1,t2,t3,t4,t5) /* v+vv=x^2 */
96
s1=v*(f11.d+v*(f13.d+v*(f15.d+v*(f17.d+v*f19.d))));
97
ADD2(f9.d,ff9.d,s1,ZERO,s2,ss2,t1,t2)
98
MUL2(v,vv,s2,ss2,s1,ss1,t1,t2,t3,t4,t5,t6,t7,t8)
99
ADD2(f7.d,ff7.d,s1,ss1,s2,ss2,t1,t2)
100
MUL2(v,vv,s2,ss2,s1,ss1,t1,t2,t3,t4,t5,t6,t7,t8)
101
ADD2(f5.d,ff5.d,s1,ss1,s2,ss2,t1,t2)
102
MUL2(v,vv,s2,ss2,s1,ss1,t1,t2,t3,t4,t5,t6,t7,t8)
103
ADD2(f3.d,ff3.d,s1,ss1,s2,ss2,t1,t2)
104
MUL2(v,vv,s2,ss2,s1,ss1,t1,t2,t3,t4,t5,t6,t7,t8)
105
MUL2(x,ZERO,s1,ss1,s2,ss2,t1,t2,t3,t4,t5,t6,t7,t8)
106
ADD2(x,ZERO,s2,ss2,s1,ss1,t1,t2)
107
if ((y=s1+(ss1-U5*s1)) == s1+(ss1+U5*s1)) return y;
102
111
else { /* B <= u < C */
103
112
i=(TWO52+TWO8*u)-TWO52; i-=16;
105
114
yy=z*(cij[i][2].d+z*(cij[i][3].d+z*(cij[i][4].d+
106
z*(cij[i][5].d+z* cij[i][6].d))));
115
z*(cij[i][5].d+z* cij[i][6].d))));
109
if (i<48) u2=U21; /* u < 1/4 */
110
else u2=U22; } /* 1/4 <= u < 1/2 */
118
if (i<48) u2=U21; /* u < 1/4 */
119
else u2=U22; } /* 1/4 <= u < 1/2 */
112
if (i<176) u2=U23; /* 1/2 <= u < 3/4 */
113
else u2=U24; } /* 3/4 <= u <= 1 */
121
if (i<176) u2=U23; /* 1/2 <= u < 3/4 */
122
else u2=U24; } /* 3/4 <= u <= 1 */
114
123
if ((y=t1+(yy-u2*t1)) == t1+(yy+u2*t1)) return __signArctan(x,y);
117
126
s1=z*(hij[i][11].d+z*(hij[i][12].d+z*(hij[i][13].d+
118
z*(hij[i][14].d+z* hij[i][15].d))));
127
z*(hij[i][14].d+z* hij[i][15].d))));
119
128
ADD2(hij[i][9].d,hij[i][10].d,s1,ZERO,s2,ss2,t1,t2)
120
129
MUL2(z,ZERO,s2,ss2,s1,ss1,t1,t2,t3,t4,t5,t6,t7,t8)
121
130
ADD2(hij[i][7].d,hij[i][8].d,s1,ss1,s2,ss2,t1,t2)
167
176
if (u<E) { /* D <= u < E */
169
EMULV(w,u,t1,t2,t3,t4,t5,t6,t7)
170
yy=w*v*(d3.d+v*(d5.d+v*(d7.d+v*(d9.d+v*(d11.d+v*d13.d)))));
173
yy=((HPI1+cor)-ww)-yy;
174
if ((y=t3+(yy-U4)) == t3+(yy+U4)) return __signArctan(x,y);
178
EMULV(w,u,t1,t2,t3,t4,t5,t6,t7)
179
yy=w*v*(d3.d+v*(d5.d+v*(d7.d+v*(d9.d+v*(d11.d+v*d13.d)))));
182
yy=((HPI1+cor)-ww)-yy;
183
if ((y=t3+(yy-U4)) == t3+(yy+U4)) return __signArctan(x,y);
176
DIV2(ONE,ZERO,u,ZERO,w,ww,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10)
177
MUL2(w,ww,w,ww,v,vv,t1,t2,t3,t4,t5,t6,t7,t8)
178
s1=v*(f11.d+v*(f13.d+v*(f15.d+v*(f17.d+v*f19.d))));
179
ADD2(f9.d,ff9.d,s1,ZERO,s2,ss2,t1,t2)
180
MUL2(v,vv,s2,ss2,s1,ss1,t1,t2,t3,t4,t5,t6,t7,t8)
181
ADD2(f7.d,ff7.d,s1,ss1,s2,ss2,t1,t2)
182
MUL2(v,vv,s2,ss2,s1,ss1,t1,t2,t3,t4,t5,t6,t7,t8)
183
ADD2(f5.d,ff5.d,s1,ss1,s2,ss2,t1,t2)
184
MUL2(v,vv,s2,ss2,s1,ss1,t1,t2,t3,t4,t5,t6,t7,t8)
185
ADD2(f3.d,ff3.d,s1,ss1,s2,ss2,t1,t2)
186
MUL2(v,vv,s2,ss2,s1,ss1,t1,t2,t3,t4,t5,t6,t7,t8)
187
MUL2(w,ww,s1,ss1,s2,ss2,t1,t2,t3,t4,t5,t6,t7,t8)
188
ADD2(w,ww,s2,ss2,s1,ss1,t1,t2)
189
SUB2(HPI,HPI1,s1,ss1,s2,ss2,t1,t2)
190
if ((y=s2+(ss2-U8)) == s2+(ss2+U8)) return __signArctan(x,y);
185
DIV2(ONE,ZERO,u,ZERO,w,ww,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10)
186
MUL2(w,ww,w,ww,v,vv,t1,t2,t3,t4,t5,t6,t7,t8)
187
s1=v*(f11.d+v*(f13.d+v*(f15.d+v*(f17.d+v*f19.d))));
188
ADD2(f9.d,ff9.d,s1,ZERO,s2,ss2,t1,t2)
189
MUL2(v,vv,s2,ss2,s1,ss1,t1,t2,t3,t4,t5,t6,t7,t8)
190
ADD2(f7.d,ff7.d,s1,ss1,s2,ss2,t1,t2)
191
MUL2(v,vv,s2,ss2,s1,ss1,t1,t2,t3,t4,t5,t6,t7,t8)
192
ADD2(f5.d,ff5.d,s1,ss1,s2,ss2,t1,t2)
193
MUL2(v,vv,s2,ss2,s1,ss1,t1,t2,t3,t4,t5,t6,t7,t8)
194
ADD2(f3.d,ff3.d,s1,ss1,s2,ss2,t1,t2)
195
MUL2(v,vv,s2,ss2,s1,ss1,t1,t2,t3,t4,t5,t6,t7,t8)
196
MUL2(w,ww,s1,ss1,s2,ss2,t1,t2,t3,t4,t5,t6,t7,t8)
197
ADD2(w,ww,s2,ss2,s1,ss1,t1,t2)
198
SUB2(HPI,HPI1,s1,ss1,s2,ss2,t1,t2)
199
if ((y=s2+(ss2-U8)) == s2+(ss2+U8)) return __signArctan(x,y);
192
201
return atanMp(x,pr);
204
/* Fix the sign of y and return */
205
double __signArctan(double x,double y){
207
if (x<ZERO) return -y;
211
212
/* Final stages. Compute atan(x) by multiple precision arithmetic */
212
213
static double atanMp(double x,const int pr[]){
213
214
mp_no mpx,mpy,mpy2,mperr,mpt1,mpy1;