intervals 0.3.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION.txt +1 -0
- data/ext/crlibm/AUTHORS +2 -0
- data/ext/crlibm/COPYING +504 -0
- data/ext/crlibm/ChangeLog +80 -0
- data/ext/crlibm/INSTALL +182 -0
- data/ext/crlibm/Makefile.am +84 -0
- data/ext/crlibm/Makefile.in +530 -0
- data/ext/crlibm/NEWS +0 -0
- data/ext/crlibm/README +31 -0
- data/ext/crlibm/TODO +47 -0
- data/ext/crlibm/VERSION +1 -0
- data/ext/crlibm/aclocal.m4 +989 -0
- data/ext/crlibm/atan-itanium.c +846 -0
- data/ext/crlibm/atan-pentium.c +261 -0
- data/ext/crlibm/atan_accurate.c +244 -0
- data/ext/crlibm/atan_accurate.h +191 -0
- data/ext/crlibm/atan_fast.c +324 -0
- data/ext/crlibm/atan_fast.h +678 -0
- data/ext/crlibm/config.guess +1461 -0
- data/ext/crlibm/config.sub +1566 -0
- data/ext/crlibm/configure +7517 -0
- data/ext/crlibm/configure.ac +364 -0
- data/ext/crlibm/crlibm.h +125 -0
- data/ext/crlibm/crlibm_config.h +149 -0
- data/ext/crlibm/crlibm_config.h.in +148 -0
- data/ext/crlibm/crlibm_private.c +293 -0
- data/ext/crlibm/crlibm_private.h +658 -0
- data/ext/crlibm/csh_fast.c +631 -0
- data/ext/crlibm/csh_fast.h +771 -0
- data/ext/crlibm/double-extended.h +496 -0
- data/ext/crlibm/exp-td.c +962 -0
- data/ext/crlibm/exp-td.h +685 -0
- data/ext/crlibm/exp_accurate.c +197 -0
- data/ext/crlibm/exp_accurate.h +85 -0
- data/ext/crlibm/gappa/log-de-E0-logir0.gappa +106 -0
- data/ext/crlibm/gappa/log-de-E0.gappa +79 -0
- data/ext/crlibm/gappa/log-de.gappa +81 -0
- data/ext/crlibm/gappa/log-td-E0-logir0.gappa +126 -0
- data/ext/crlibm/gappa/log-td-E0.gappa +143 -0
- data/ext/crlibm/gappa/log-td-accurate-E0-logir0.gappa +230 -0
- data/ext/crlibm/gappa/log-td-accurate-E0.gappa +213 -0
- data/ext/crlibm/gappa/log-td-accurate.gappa +217 -0
- data/ext/crlibm/gappa/log-td.gappa +156 -0
- data/ext/crlibm/gappa/trigoSinCosCase3.gappa +204 -0
- data/ext/crlibm/gappa/trigoTanCase2.gappa +73 -0
- data/ext/crlibm/install-sh +269 -0
- data/ext/crlibm/log-de.c +431 -0
- data/ext/crlibm/log-de.h +732 -0
- data/ext/crlibm/log-td.c +852 -0
- data/ext/crlibm/log-td.h +819 -0
- data/ext/crlibm/log10-td.c +906 -0
- data/ext/crlibm/log10-td.h +823 -0
- data/ext/crlibm/log2-td.c +935 -0
- data/ext/crlibm/log2-td.h +821 -0
- data/ext/crlibm/maple/atan.mpl +359 -0
- data/ext/crlibm/maple/common-procedures.mpl +997 -0
- data/ext/crlibm/maple/csh.mpl +446 -0
- data/ext/crlibm/maple/double-extended.mpl +151 -0
- data/ext/crlibm/maple/exp-td.mpl +195 -0
- data/ext/crlibm/maple/log-de.mpl +243 -0
- data/ext/crlibm/maple/log-td.mpl +316 -0
- data/ext/crlibm/maple/log10-td.mpl +345 -0
- data/ext/crlibm/maple/log2-td.mpl +334 -0
- data/ext/crlibm/maple/trigo.mpl +728 -0
- data/ext/crlibm/maple/triple-double.mpl +58 -0
- data/ext/crlibm/missing +198 -0
- data/ext/crlibm/mkinstalldirs +40 -0
- data/ext/crlibm/rem_pio2_accurate.c +219 -0
- data/ext/crlibm/rem_pio2_accurate.h +53 -0
- data/ext/crlibm/scs_lib/AUTHORS +3 -0
- data/ext/crlibm/scs_lib/COPYING +504 -0
- data/ext/crlibm/scs_lib/ChangeLog +16 -0
- data/ext/crlibm/scs_lib/INSTALL +215 -0
- data/ext/crlibm/scs_lib/Makefile.am +18 -0
- data/ext/crlibm/scs_lib/Makefile.in +328 -0
- data/ext/crlibm/scs_lib/NEWS +0 -0
- data/ext/crlibm/scs_lib/README +9 -0
- data/ext/crlibm/scs_lib/TODO +4 -0
- data/ext/crlibm/scs_lib/addition_scs.c +623 -0
- data/ext/crlibm/scs_lib/config.guess +1461 -0
- data/ext/crlibm/scs_lib/config.sub +1566 -0
- data/ext/crlibm/scs_lib/configure +6226 -0
- data/ext/crlibm/scs_lib/division_scs.c +110 -0
- data/ext/crlibm/scs_lib/double2scs.c +174 -0
- data/ext/crlibm/scs_lib/install-sh +269 -0
- data/ext/crlibm/scs_lib/missing +198 -0
- data/ext/crlibm/scs_lib/mkinstalldirs +40 -0
- data/ext/crlibm/scs_lib/multiplication_scs.c +456 -0
- data/ext/crlibm/scs_lib/poly_fct.c +112 -0
- data/ext/crlibm/scs_lib/print_scs.c +73 -0
- data/ext/crlibm/scs_lib/rand_scs.c +63 -0
- data/ext/crlibm/scs_lib/scs.h +353 -0
- data/ext/crlibm/scs_lib/scs2double.c +391 -0
- data/ext/crlibm/scs_lib/scs2mpf.c +58 -0
- data/ext/crlibm/scs_lib/scs2mpfr.c +61 -0
- data/ext/crlibm/scs_lib/scs_private.c +23 -0
- data/ext/crlibm/scs_lib/scs_private.h +133 -0
- data/ext/crlibm/scs_lib/tests/tbx_timing.h +102 -0
- data/ext/crlibm/scs_lib/wrapper_scs.h +486 -0
- data/ext/crlibm/scs_lib/zero_scs.c +52 -0
- data/ext/crlibm/stamp-h.in +1 -0
- data/ext/crlibm/tests/Makefile.am +43 -0
- data/ext/crlibm/tests/Makefile.in +396 -0
- data/ext/crlibm/tests/blind_test.c +148 -0
- data/ext/crlibm/tests/generate_test_vectors.c +258 -0
- data/ext/crlibm/tests/soak_test.c +334 -0
- data/ext/crlibm/tests/test_common.c +627 -0
- data/ext/crlibm/tests/test_common.h +28 -0
- data/ext/crlibm/tests/test_perf.c +570 -0
- data/ext/crlibm/tests/test_val.c +249 -0
- data/ext/crlibm/trigo_accurate.c +500 -0
- data/ext/crlibm/trigo_accurate.h +331 -0
- data/ext/crlibm/trigo_fast.c +1219 -0
- data/ext/crlibm/trigo_fast.h +639 -0
- data/ext/crlibm/triple-double.h +878 -0
- data/ext/extconf.rb +31 -0
- data/ext/fpu.c +107 -0
- data/ext/jamis-mod.rb +591 -0
- data/lib/fpu.rb +287 -0
- data/lib/interval.rb +1170 -0
- data/lib/intervals.rb +212 -0
- data/lib/struct_float.rb +133 -0
- data/test/data_atan.txt +360 -0
- data/test/data_cos.txt +346 -0
- data/test/data_cosh.txt +3322 -0
- data/test/data_exp.txt +3322 -0
- data/test/data_log.txt +141 -0
- data/test/data_sin.txt +140 -0
- data/test/data_sinh.txt +3322 -0
- data/test/data_tan.txt +342 -0
- metadata +186 -0
@@ -0,0 +1,359 @@
|
|
1
|
+
restart:
|
2
|
+
Digits := 100:
|
3
|
+
with (numapprox):with(orthopoly):
|
4
|
+
read "common-procedures.mpl";
|
5
|
+
mkdir("TEMPATAN");
|
6
|
+
|
7
|
+
#First, quick phase
|
8
|
+
#Approach for the first function:
|
9
|
+
#atan(x) = atan(b(i)) + atan ( (x-bi) / (1+x*b(i) ) )
|
10
|
+
#We try to have 64 correct bits
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
#Constants
|
15
|
+
|
16
|
+
|
17
|
+
#if (x >= xmax) : return arctan(x)/2)=neareast(Pi/2)
|
18
|
+
|
19
|
+
log[2](evalf(min(solve(arctan(x)=nearest(Pi/2),x)))):
|
20
|
+
xmax:=2^54:
|
21
|
+
|
22
|
+
|
23
|
+
#halfPi=Pi/2 (remark that maxvalue < Pi/2 so that atan(x) < Pi/2
|
24
|
+
|
25
|
+
halfPi:=nearest(Pi/2):
|
26
|
+
halfPi_to_plus_infinity:=nearest(nearest(Pi/2)*(1+2^(-53))):
|
27
|
+
|
28
|
+
|
29
|
+
# if (xmin<xmin) : return arctan(x)=x
|
30
|
+
|
31
|
+
xmin=2^(-27);
|
32
|
+
|
33
|
+
ieeehexa(halfPi); ieeehexa( halfPi_to_plus_infinity ); ieeehexa(2^(-27));ieeehexa(2^(54));ieeehexa(2^(-10));
|
34
|
+
|
35
|
+
|
36
|
+
#Interval parameters
|
37
|
+
#Some constants :
|
38
|
+
e:=2^(-6.3):
|
39
|
+
marge := 2^(-30):
|
40
|
+
|
41
|
+
#The intervals are (a[i],a[i+1]). the "middle" is b(i) :
|
42
|
+
maxx := bi -> simplify( solve( (x-bi) / (1+x*bi) = e ,x) ):
|
43
|
+
minx := bi -> simplify(solve( (x-bi) /(1+x*bi)=-e ,x)):
|
44
|
+
|
45
|
+
nextbi := proc (x) evalf( max(solve( minx(bi) = x ,bi) )*(1-marge)); end:
|
46
|
+
|
47
|
+
allbi := proc (n)
|
48
|
+
local xi,nbi,x,i,j;
|
49
|
+
global b,a, nb_of_ai, nb_of_bi, value_for_dicho;
|
50
|
+
x := e;
|
51
|
+
nbi := 0;
|
52
|
+
i := 0;
|
53
|
+
while(i<n and nbi < 1/e and nbi >= 0) do
|
54
|
+
nbi := nearest ( nextbi(x) );
|
55
|
+
b[i] := evalf( nbi );
|
56
|
+
a[i] := x;
|
57
|
+
x := evalf(maxx(nbi));
|
58
|
+
i:=i+1;
|
59
|
+
od;
|
60
|
+
j:=0;
|
61
|
+
while ( 2^j < i ) do j:=j+1 od:
|
62
|
+
nb_of_ai := i;
|
63
|
+
nb_of_bi := i;
|
64
|
+
b[i-1] := nearest(1/e+4):
|
65
|
+
value_for_dicho := 2^j;
|
66
|
+
return i,b[0],b[i-1];
|
67
|
+
end:
|
68
|
+
|
69
|
+
allbi(100);
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
|
74
|
+
#The polynome and its size ( 4 because 4 terms : x^2/3, ...)
|
75
|
+
|
76
|
+
Q9:= poly_exact(x-1/3*x^3+1/5*x^5 -1/7*x^7+1/9*x^9):
|
77
|
+
deg_poly := 4:
|
78
|
+
coef_poly[0]:=nearest (-1/3):
|
79
|
+
coef_poly[1]:=nearest (1/5):
|
80
|
+
coef_poly[2]:=nearest (-1/7):
|
81
|
+
coef_poly[3]:=nearest (1/9):
|
82
|
+
|
83
|
+
Q := x^2 * coef_poly[0] + x^4*coef_poly[1] + x^6*coef_poly[2] + x^8 * coef_poly[3]:
|
84
|
+
|
85
|
+
Qprime := poly_exact( x * coef_poly[0] + x^2*coef_poly[1] + x^3*coef_poly[2] + x^4 * coef_poly[3]):
|
86
|
+
|
87
|
+
log[2] (infnorm( (arctan(x)-x*(1+Q) )/x,x=2^(-53)..e));
|
88
|
+
# we can note that arctan(x) = sum((-1)^i*x^(2*i+1)/(2*i+1), i = (0 .. infinity))
|
89
|
+
# so ( arctan(x) - Q9(x) ) / x = sum((-1)^i*x^(2*i)/(2*i+1), i = (5 .. infinity))
|
90
|
+
# so abs ( (arctan(x) -Q9(x) )/x ) <= x^10 * sum((-1)^(i+1)*x^(2*i)/(2*i+1+10), i = (0 .. infinity))
|
91
|
+
# <= x^10 * 1/11
|
92
|
+
# <= 2^(-66) if x<2^(-6.3)
|
93
|
+
|
94
|
+
|
95
|
+
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
|
102
|
+
#Conputation of the RN constant
|
103
|
+
|
104
|
+
|
105
|
+
#Epsilon = relative error
|
106
|
+
#Delta = absolute error
|
107
|
+
#1st : Error about reduction:
|
108
|
+
|
109
|
+
EpsilonXminusBi := 2^(-105):
|
110
|
+
|
111
|
+
# 1 + x*b[i] :
|
112
|
+
Epsilon1A22xbi := 2^(-104):
|
113
|
+
|
114
|
+
|
115
|
+
# Xred = (x-b[i]) / ( 1 + x*b[i] )
|
116
|
+
|
117
|
+
EpsilonXred := EpsilonXminusBi+Epsilon1A22xbi + 2^(-105):
|
118
|
+
|
119
|
+
DeltaXred := EpsilonXred * e:
|
120
|
+
|
121
|
+
log2(EpsilonXred);
|
122
|
+
|
123
|
+
#Polynomial evaluation :
|
124
|
+
#atan ~= x - x^3/3 + x^5/5 - x^7/7 + x^9/9
|
125
|
+
# ~= x * ( 1 + Q(x^2) )
|
126
|
+
# = (xhi+xlo) * ( 1 + Q)
|
127
|
+
# ~= xhi + (xhi*Q + xlo)
|
128
|
+
|
129
|
+
# Warning : the approx about x !!
|
130
|
+
|
131
|
+
#calc of Q:
|
132
|
+
|
133
|
+
EpsilonXred2 := (1+2^(-53) + 2^(-105) )^2 * (1+2^(-53)) -1 :
|
134
|
+
|
135
|
+
log2(EpsilonXred2);
|
136
|
+
|
137
|
+
errlist:=errlist_quickphase_horner( degree( x^4 ),0,0,EpsilonXred2, 2**(-53)):
|
138
|
+
|
139
|
+
rounding_error1:= compute_horner_rounding_error(Qprime,x,e,errlist,true):
|
140
|
+
|
141
|
+
EpsilonQ := rounding_error1[1]:
|
142
|
+
log2(EpsilonQ);
|
143
|
+
|
144
|
+
# Since q will be multiplied in x(1+q), its absolute error term is :
|
145
|
+
|
146
|
+
Qmax:=infnorm(Qprime,x=-e^2..e^2):
|
147
|
+
|
148
|
+
DeltaQ := e*Qmax*EpsilonQ;
|
149
|
+
log2(DeltaQ);
|
150
|
+
|
151
|
+
# calc of xi*Q + xlo + atan(b[i])lo
|
152
|
+
|
153
|
+
#First the truncation of xredlo*q : at most half an ulp of xredhi*q
|
154
|
+
DeltaTruncXredloQ := 2^(-53) * e * Qmax:
|
155
|
+
log2(DeltaTruncXredloQ);
|
156
|
+
#then the sum of atanbilo and xredlo : the largest term is atanbilo
|
157
|
+
DeltaAdd1 := 0.5*ulp(2^(-53)*(Pi/2 + e)):
|
158
|
+
log2(DeltaAdd1);
|
159
|
+
|
160
|
+
#then compute xredhi*q
|
161
|
+
DeltaXredhiQ := 0.5*ulp(e*Qmax):
|
162
|
+
log2(DeltaXredhiQ);
|
163
|
+
|
164
|
+
# and the second addition
|
165
|
+
DeltaAdd2 := 0.5*ulp(e*Qmax + 2^(-53)*(Pi/2 + e) ):
|
166
|
+
log2(DeltaAdd2);
|
167
|
+
|
168
|
+
DeltaAtanlolo := DeltaTruncXredloQ + DeltaAdd1 + DeltaXredhiQ + DeltaAdd2:
|
169
|
+
log2(DeltaAtanlolo);
|
170
|
+
|
171
|
+
# In the second reconstruction there is one more FP add which is
|
172
|
+
# aligned to the previous:
|
173
|
+
DeltaReconst := DeltaAtanlolo + DeltaAdd2 :
|
174
|
+
log2(DeltaReconst);
|
175
|
+
|
176
|
+
|
177
|
+
|
178
|
+
# error due to the approx of atan by P : < e^11/11
|
179
|
+
Deltaapprox := infnorm( (arctan(x)-x*(1+Q)), x=0..e):
|
180
|
+
|
181
|
+
log[2](Deltaapprox);
|
182
|
+
|
183
|
+
|
184
|
+
|
185
|
+
|
186
|
+
|
187
|
+
DeltaTotal := Deltaapprox + DeltaQ + DeltaReconst :
|
188
|
+
log2(DeltaTotal);
|
189
|
+
EpsilonTotal := evalf( DeltaTotal / arctan(xx) ):
|
190
|
+
|
191
|
+
EpsilonFinal := infnorm( EpsilonTotal,xx=2^(-6.3)..1,'xmaxmax'):
|
192
|
+
EpsilonFinal_i_10 := infnorm( EpsilonTotal,xx=a[10]..2^60,'xmaxmax'):
|
193
|
+
log2( EpsilonFinal );
|
194
|
+
log2( EpsilonFinal_i_10 );
|
195
|
+
|
196
|
+
|
197
|
+
# Computation of e and e_i_30 (which is e when i>30 (ie x>1)
|
198
|
+
E := evalf(compute_rn_constant(EpsilonFinal));
|
199
|
+
E_i_10 := evalf(compute_rn_constant(EpsilonFinal_i_10));
|
200
|
+
|
201
|
+
|
202
|
+
#An other Constant : when there is no reduction.
|
203
|
+
#We compute the polynom and then atan(x) = x + x.Q
|
204
|
+
|
205
|
+
Epsilonx2 := 2^(-53):
|
206
|
+
errlist:=errlist_quickphase_horner( degree( Qprime ),0,0,Epsilonx2, 2**(-53)):
|
207
|
+
rounding_error:= compute_horner_rounding_error(Qprime,x,e,errlist,true):
|
208
|
+
|
209
|
+
epsilon_Q := rounding_error[1]:
|
210
|
+
log[2](epsilon_Q);
|
211
|
+
|
212
|
+
epsilon_x_Q := 2^(-52):
|
213
|
+
|
214
|
+
delta_final := 2^(-105)*x + epsilon_Q*x^3 + epsilon_x_Q*x^3 - arctan(x) + x*(1+Q):
|
215
|
+
epsilon_final := infnorm(delta_final/x,x=2^(-10)..e):
|
216
|
+
epsilon_final_m10 := infnorm(delta_final/x,x=2^(-24)..2^(-10)):
|
217
|
+
|
218
|
+
log[2](epsilon_final);
|
219
|
+
E_no_reduction := evalf(compute_rn_constant(epsilon_final));
|
220
|
+
E_no_reduction_m10 := evalf(compute_rn_constant(epsilon_final_m10));
|
221
|
+
|
222
|
+
|
223
|
+
|
224
|
+
# Output
|
225
|
+
|
226
|
+
|
227
|
+
#test
|
228
|
+
filename:="TEMPATAN/atan_fast.h":
|
229
|
+
|
230
|
+
fd:=fopen(filename, WRITE, TEXT):
|
231
|
+
fprintf(fd, "\n/*File generated by maple/atan.mpl */\n"):
|
232
|
+
|
233
|
+
fprintf(fd, "#ifndef _ATAN_FAST_H\n#define _ATAN_FAST_H\n\n");
|
234
|
+
|
235
|
+
fprintf(fd, "#include \"crlibm.h\"\n#include \"crlibm_private.h\"\n"):
|
236
|
+
|
237
|
+
fprintf(fd,"#ifdef WORDS_BIGENDIAN\n"):
|
238
|
+
fprintf(fd, "static const db_number HALFPI = {{0x3FF921FB,0x54442D18}};"):
|
239
|
+
fprintf(fd, "static const db_number HALFPI_TO_PLUS_INFINITY = {{0x3FF921FB,0x54442D19}};"):
|
240
|
+
fprintf(fd,"\n#else\n"):
|
241
|
+
fprintf(fd, "static const db_number HALFPI = {{0x54442D18,0x3FF921FB}};"):
|
242
|
+
fprintf(fd, "static const db_number HALFPI_TO_PLUS_INFINITY = {{0x54442D19,0x3FF921FB}};"):
|
243
|
+
fprintf(fd,"\n"):
|
244
|
+
fprintf(fd,"#endif\n"):
|
245
|
+
|
246
|
+
fprintf(fd, "#define MIN_REDUCTION_NEEDED %1.50f\n",e):
|
247
|
+
|
248
|
+
fprintf(fd,"#define nb_of_ai %d\n",nb_of_ai):
|
249
|
+
fprintf(fd,"#define nb_of_bi %d\n",nb_of_bi):
|
250
|
+
|
251
|
+
# we multiply by 2^(-20) in order to prevent from rounding
|
252
|
+
fprintf(fd, "static const double rncst[4] ={\n"):
|
253
|
+
fprintf(fd, "%1.50f , /* i<10 */ \n",E*(1+2^(-20))) :
|
254
|
+
fprintf(fd, "%1.50f , /* i>10 */ \n",E_i_10*(1+2^(-20))) :
|
255
|
+
fprintf(fd, "%1.50f , /* e > 2^-10 */ \n",E_no_reduction*(1+2^(-20))) :
|
256
|
+
fprintf(fd, "%1.50f , /* e < 2^-10 */ \n };\n",E_no_reduction_m10*(1+2^(-20))) :
|
257
|
+
|
258
|
+
fprintf(fd, "static const double epsilon[4] ={\n"):
|
259
|
+
fprintf(fd, "%1.50e ,\n",EpsilonFinal *(1+2^(-20))) :
|
260
|
+
fprintf(fd, "%1.50e ,\n",EpsilonFinal_i_10*(1+2^(-20))) :
|
261
|
+
fprintf(fd, "%1.50e ,\n",epsilon_final*(1+2^(-20))) :
|
262
|
+
fprintf(fd, "%1.50e ,\n };\n",epsilon_final_m10*(1+2^(-20))) :
|
263
|
+
|
264
|
+
fprintf(fd, "#define DEGREE %d\n", deg_poly):
|
265
|
+
fprintf(fd, "static double const coef_poly[%d] = \n{\n",deg_poly):
|
266
|
+
|
267
|
+
for i from deg_poly-1 to 0 by -1 do
|
268
|
+
fprintf(fd, "/* coef for degree %d */ %1.50f, \n" , 2*i+3, coef_poly[i]):
|
269
|
+
od:
|
270
|
+
fprintf(fd," }; \n");
|
271
|
+
|
272
|
+
fprintf(fd,"#define A 0\n"):
|
273
|
+
fprintf(fd,"#define B 1\n"):
|
274
|
+
fprintf(fd,"#define ATAN_BHI 2\n"):
|
275
|
+
fprintf(fd,"#define ATAN_BLO 3\n"):
|
276
|
+
|
277
|
+
fprintf(fd,"\n#ifdef WORDS_BIGENDIAN\n "):
|
278
|
+
|
279
|
+
for isbig from 1 to 0 by -1 do
|
280
|
+
|
281
|
+
if(isbig=0) then
|
282
|
+
fprintf(fd,"#else\n");
|
283
|
+
fi:
|
284
|
+
|
285
|
+
if(not (nb_of_ai = nb_of_bi)) then
|
286
|
+
printf("Warning : nb_of_ai != nb_of_bi, this should not work");
|
287
|
+
fi:
|
288
|
+
|
289
|
+
fprintf(fd,"\n/* limits of the intervals [a[i],b[i]] */\n");
|
290
|
+
fprintf(fd, "static db_number const arctan_table[%d][4] = \n{\n" , nb_of_ai );
|
291
|
+
|
292
|
+
for i from 0 to nb_of_ai - 1 do
|
293
|
+
fprintf(fd, "{\n/*a[%d] */ ",i);
|
294
|
+
printendian(fd,a[i],isbig);
|
295
|
+
fprintf(fd," ,\n/*b[%d] : */ ",i):
|
296
|
+
printendian(fd,b[i],isbig):
|
297
|
+
fprintf(fd," ,\n/*atan_b[%d]*/ ",i):
|
298
|
+
printendian(fd, arctan(b[i]) ,isbig):
|
299
|
+
fprintf(fd,",");
|
300
|
+
printendian(fd, arctan(b[i])-nearest(arctan(b[i])) ,isbig);
|
301
|
+
fprintf(fd," ,\n}\n,");
|
302
|
+
od;
|
303
|
+
fprintf(fd,"\n};\n");
|
304
|
+
od:
|
305
|
+
|
306
|
+
fprintf(fd,"\n#endif\n\n"):
|
307
|
+
|
308
|
+
fprintf(fd, "#endif /* def _ATAN_FAST_H */\n");
|
309
|
+
|
310
|
+
fclose(fd);
|
311
|
+
|
312
|
+
|
313
|
+
|
314
|
+
# Scs phase
|
315
|
+
|
316
|
+
#Now we want a precision of 130 bits in order to have correct rounding in all cases.
|
317
|
+
evalf(log[2](e^21/21));
|
318
|
+
#Test about Rounding :
|
319
|
+
#error on the polynom :
|
320
|
+
P_scs := convert(series(arctan(x),x=0,21),polynom);
|
321
|
+
evalf(log[2](e^21/21));
|
322
|
+
#Intervals parameters
|
323
|
+
#We choose the same e and the same intervals as in the quick phase.
|
324
|
+
|
325
|
+
#We have the same b[i]s and a[i]s but we save atan[b[i]] on 4 doubles
|
326
|
+
|
327
|
+
# Output
|
328
|
+
filename:="TEMPATAN/atan_accurate.h":
|
329
|
+
fd1:=fopen(filename, WRITE, TEXT):
|
330
|
+
|
331
|
+
fprintf(fd1, "#include \"crlibm.h\"\n#include \"crlibm_private.h\" \n#include \"atan_fast.h\"\n"):
|
332
|
+
fprintf(fd1, "\n/*File generated by maple/atan.mpl */\n"):
|
333
|
+
|
334
|
+
Write_SCS_poly(fd1, "constant_poly", P_scs);
|
335
|
+
|
336
|
+
fprintf(fd1,"#define constant_poly_ptr (scs_ptr)&constant_poly\n");
|
337
|
+
|
338
|
+
fprintf(fd1,"#ifdef WORDS_BIGENDIAN\n\n"):
|
339
|
+
for isbig from 1 to 0 by -1 do
|
340
|
+
if isbig = 0 then
|
341
|
+
fprintf(fd1, "\n#else\n"):
|
342
|
+
fi:
|
343
|
+
|
344
|
+
fprintf(fd1,"static const db_number atan_blolo[%d] = {\n",nb_of_ai);
|
345
|
+
for i from 0 to nb_of_ai-1 do
|
346
|
+
fprintf(fd1,"/* %d */ ",i):
|
347
|
+
temp0 := nearest(arctan(b[i]));
|
348
|
+
temp := nearest( arctan(b[i]) - nearest(arctan(b[i])));
|
349
|
+
temp1 := nearest( arctan(b[i]) - temp -temp0);
|
350
|
+
printendian(fd1,temp1,isbig):
|
351
|
+
fprintf(fd1,", \n");
|
352
|
+
od:
|
353
|
+
|
354
|
+
fprintf(fd1,"};\n"):
|
355
|
+
|
356
|
+
od:
|
357
|
+
fprintf(fd1,"\n#endif /* WORDS_BIGENDIAN */ \n");
|
358
|
+
|
359
|
+
fclose(fd1);
|