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,217 @@
|
|
1
|
+
|
2
|
+
log2h = <float64ne> (_log2h);
|
3
|
+
log2m = <float64ne> (_log2m);
|
4
|
+
log2l = <float64ne> (_log2l);
|
5
|
+
|
6
|
+
Log2hml = log2h + log2m + log2l; #MAPLE
|
7
|
+
|
8
|
+
logih = <float64ne> (_logih);
|
9
|
+
logim = <float64ne> (_logim);
|
10
|
+
logil = <float64ne> (_logil);
|
11
|
+
|
12
|
+
Logihml = logih + logim + logil; #MAPLE
|
13
|
+
|
14
|
+
|
15
|
+
accPolyC14 = <float64ne> (_accPolyC14);
|
16
|
+
accPolyC13 = <float64ne> (_accPolyC13);
|
17
|
+
accPolyC12 = <float64ne> (_accPolyC12);
|
18
|
+
accPolyC11 = <float64ne> (_accPolyC11);
|
19
|
+
accPolyC10 = <float64ne> (_accPolyC10);
|
20
|
+
|
21
|
+
accPolyC9h = <float64ne> (_accPolyC9h);
|
22
|
+
accPolyC9l = <float64ne> (_accPolyC9l);
|
23
|
+
AccPolyC9hl = accPolyC9h + accPolyC9l; #MAPLE
|
24
|
+
accPolyC8h = <float64ne> (_accPolyC8h);
|
25
|
+
accPolyC8l = <float64ne> (_accPolyC8l);
|
26
|
+
AccPolyC8hl = accPolyC8h + accPolyC8l; #MAPLE
|
27
|
+
accPolyC7h = <float64ne> (_accPolyC7h);
|
28
|
+
accPolyC7l = <float64ne> (_accPolyC7l);
|
29
|
+
AccPolyC7hl = accPolyC7h + accPolyC7l; #MAPLE
|
30
|
+
accPolyC6h = <float64ne> (_accPolyC6h);
|
31
|
+
accPolyC6l = <float64ne> (_accPolyC6l);
|
32
|
+
AccPolyC6hl = accPolyC6h + accPolyC6l; #MAPLE
|
33
|
+
accPolyC5h = <float64ne> (_accPolyC5h);
|
34
|
+
accPolyC5l = <float64ne> (_accPolyC5l);
|
35
|
+
AccPolyC5hl = accPolyC5h + accPolyC5l; #MAPLE
|
36
|
+
accPolyC4h = <float64ne> (_accPolyC4h);
|
37
|
+
accPolyC4l = <float64ne> (_accPolyC4l);
|
38
|
+
AccPolyC4hl = accPolyC4h + accPolyC4l; #MAPLE
|
39
|
+
accPolyC3h = <float64ne> (_accPolyC3h);
|
40
|
+
accPolyC3l = <float64ne> (_accPolyC3l);
|
41
|
+
AccPolyC3hl = accPolyC3h + accPolyC3l; #MAPLE
|
42
|
+
|
43
|
+
E = 1; #MAPLE
|
44
|
+
|
45
|
+
zh = <float64ne> (Z);
|
46
|
+
zl = Z - zh; #MAPLE
|
47
|
+
|
48
|
+
highPoly <float64ne> = accPolyC10 + zh * (accPolyC11 + zh * (accPolyC12 + zh * (accPolyC13 + zh * accPolyC14)));
|
49
|
+
|
50
|
+
T1hl = zh * highPoly; #MAPLE
|
51
|
+
|
52
|
+
T2 = AccPolyC9hl + T1hl; #MAPLE
|
53
|
+
T3 = Z * T2hl; #MAPLE
|
54
|
+
T4 = AccPolyC8hl + T3hl; #MAPLE
|
55
|
+
T5 = Z * T4hl; #MAPLE
|
56
|
+
T6 = AccPolyC7hl + T5hl; #MAPLE
|
57
|
+
T7 = Z * T6hl; #MAPLE
|
58
|
+
T8 = AccPolyC6hl + T7hl; #MAPLE
|
59
|
+
T9 = Z * T8hl; #MAPLE
|
60
|
+
T10 = AccPolyC5hl + T9hl; #MAPLE
|
61
|
+
T11 = Z * T10hl; #MAPLE
|
62
|
+
T12 = AccPolyC4hl + T11hl; #MAPLE
|
63
|
+
T13 = Z * T12hl; #MAPLE
|
64
|
+
T14 = AccPolyC3hl + T13hl; #MAPLE
|
65
|
+
|
66
|
+
|
67
|
+
ZSquare = Z * Z; #MAPLE
|
68
|
+
ZCube = Z * ZSquarehml; #MAPLE
|
69
|
+
HigherPolyMultZ = T14hl * ZCubehml; #MAPLE
|
70
|
+
ZSquareHalfhml = -0.5 * ZSquarehml; #MAPLE
|
71
|
+
PolyWithSquare = ZSquareHalfhml + HigherPolyMultZhml; #MAPLE
|
72
|
+
Poly = Z + PolyWithSquarehml; #MAPLE
|
73
|
+
Logy = Logihml + Polyhml; #MAPLE
|
74
|
+
Log2edhml = E * Log2hml; #MAPLE
|
75
|
+
Logover = Log2edhml + Logyhml; #MAPLE
|
76
|
+
|
77
|
+
|
78
|
+
#Mathematical definition of the logarithm
|
79
|
+
|
80
|
+
MHighPoly = accPolyC10 + Z * (accPolyC11 + Z * (accPolyC12 + Z * (accPolyC13 + Z * accPolyC14))); #MAPLE
|
81
|
+
MT1 = Z * MHighPoly; #MAPLE
|
82
|
+
MT2 = AccPolyC9hl + MT1; #MAPLE
|
83
|
+
MT3 = Z * MT2; #MAPLE
|
84
|
+
MT4 = AccPolyC8hl + MT3; #MAPLE
|
85
|
+
MT5 = Z * MT4; #MAPLE
|
86
|
+
MT6 = AccPolyC7hl + MT5; #MAPLE
|
87
|
+
MT7 = Z * MT6; #MAPLE
|
88
|
+
MT8 = AccPolyC6hl + MT7; #MAPLE
|
89
|
+
MT9 = Z * MT8; #MAPLE
|
90
|
+
MT10 = AccPolyC5hl + MT9; #MAPLE
|
91
|
+
MT11 = Z * MT10; #MAPLE
|
92
|
+
MT12 = AccPolyC4hl + MT11; #MAPLE
|
93
|
+
MT13 = Z * MT12; #MAPLE
|
94
|
+
MT14 = AccPolyC3hl + MT13; #MAPLE
|
95
|
+
MZSquare = Z * Z; #MAPLE
|
96
|
+
MZCube = Z * MZSquare; #MAPLE
|
97
|
+
MHigherPolyMultZ = MT14 * MZCube; #MAPLE
|
98
|
+
MZSquareHalf = -0.5 * MZSquare; #MAPLE
|
99
|
+
MPolyWithSquare = MZSquareHalf + MHigherPolyMultZ; #MAPLE
|
100
|
+
MPoly = Z + MPolyWithSquare; #MAPLE
|
101
|
+
MLogy = MLogi + MLog1pZ; #MAPLE
|
102
|
+
MLog2E = E * MLog2; #MAPLE
|
103
|
+
MLog = MLog2E + MLogy; #MAPLE
|
104
|
+
|
105
|
+
|
106
|
+
#Useful additional definitions
|
107
|
+
|
108
|
+
delta1 = highPoly - MHighPoly; #MAPLE
|
109
|
+
delta2 = T1hl - MT1; #MAPLE
|
110
|
+
delta3 = T2hl - MT2; #MAPLE
|
111
|
+
delta4 = T3hl - MT3; #MAPLE
|
112
|
+
delta5 = T4hl - MT4; #MAPLE
|
113
|
+
delta6 = T5hl - MT5; #MAPLE
|
114
|
+
delta7 = T6hl - MT6; #MAPLE
|
115
|
+
delta8 = T7hl - MT7; #MAPLE
|
116
|
+
delta9 = T8hl - MT8; #MAPLE
|
117
|
+
delta10 = T9hl - MT9; #MAPLE
|
118
|
+
delta11 = T10hl - MT10; #MAPLE
|
119
|
+
delta12 = T11hl - MT11; #MAPLE
|
120
|
+
delta13 = T12hl - MT12; #MAPLE
|
121
|
+
delta14 = T13hl - MT13; #MAPLE
|
122
|
+
delta15 = T14hl - MT14; #MAPLE
|
123
|
+
delta16 = ZSquarehml - MZSquare; #MAPLE
|
124
|
+
delta17 = ZCubehml - MZCube; #MAPLE
|
125
|
+
delta18 = HigherPolyMultZhml - MHigherPolyMultZ; #MAPLE
|
126
|
+
delta19 = ZSquareHalfhml - MZSquareHalf; #MAPLE
|
127
|
+
delta20 = PolyWithSquarehml - MPolyWithSquare; #MAPLE
|
128
|
+
delta21 = Polyhml - MPoly; #MAPLE
|
129
|
+
delta22 = Logyhml - MLogy; #MAPLE
|
130
|
+
delta23 = Log2edhml - MLog2E; #MAPLE
|
131
|
+
delta24 = Loghml - MLog; #MAPLE
|
132
|
+
delta25 = Logihml - MLogi; #MAPLE
|
133
|
+
delta26 = Polyhml - MLog1pZ; #MAPLE
|
134
|
+
|
135
|
+
|
136
|
+
#End additional definitions
|
137
|
+
|
138
|
+
{
|
139
|
+
(T2hl - T2) / T2 in [-1b-103,1b-103]
|
140
|
+
/\ (T3hl - T3) / T3 in [-1b-102,1b-102]
|
141
|
+
/\ (T4hl - T4) / T4 in [-1b-103,1b-103]
|
142
|
+
/\ (T5hl - T5) / T5 in [-1b-102,1b-102]
|
143
|
+
/\ (T6hl - T6) / T6 in [-1b-103,1b-103]
|
144
|
+
/\ (T7hl - T7) / T7 in [-1b-102,1b-102]
|
145
|
+
/\ (T8hl - T8) / T8 in [-1b-103,1b-103]
|
146
|
+
/\ (T9hl - T9) / T9 in [-1b-102,1b-102]
|
147
|
+
/\ (T10hl - T10) / T10 in [-1b-103,1b-103]
|
148
|
+
/\ (T11hl - T11) / T11 in [-1b-102,1b-102]
|
149
|
+
/\ (T12hl - T12) / T12 in [-1b-103,1b-103]
|
150
|
+
/\ (T13hl - T13) / T13 in [-1b-102,1b-102]
|
151
|
+
/\ (T14hl - T14) / T14 in [-1b-103,1b-103]
|
152
|
+
/\ (ZSquarehml - ZSquare) / ZSquare in [-1b-149,1b-149]
|
153
|
+
/\ (ZCubehml - ZCube) / ZCube in [-1b-144,1b-144]
|
154
|
+
/\ (HigherPolyMultZhml - HigherPolyMultZ) / HigherPolyMultZ in [-1b-141,1b-141]
|
155
|
+
/\ (PolyWithSquarehml - PolyWithSquare) / PolyWithSquare in [-1b-137,1b-137]
|
156
|
+
/\ (Polyhml - Poly) / Poly in [-1b-134,1b-134]
|
157
|
+
/\ (Logyhml - Logy) / Logy in [-1b-128,1b-128]
|
158
|
+
/\ (Loghml - Logover) / Logover in [-1b-123,1b-123]
|
159
|
+
/\ (Log2hml - MLog2) / MLog2 in [-1b-126,1b-126]
|
160
|
+
/\ (Logihml - MLogi) / MLogi in [-1b-159,1b-159]
|
161
|
+
/\ (MPoly - MLog1pZ) / MLog1pZ in [-_epsilonApproxAccurate,_epsilonApproxAccurate]
|
162
|
+
/\ Z in [_zmin,_zmax]
|
163
|
+
/\ ((logh + logm + logl) - Loghml) / Loghml in [-1b-159,1b-159]
|
164
|
+
->
|
165
|
+
((logh + logm + logl) - MLog) / MLog in [-5735b-132,5735b-132]
|
166
|
+
}
|
167
|
+
|
168
|
+
MLog1pZ -> MPoly * (1 / (((MPoly - MLog1pZ) / MLog1pZ) + 1));
|
169
|
+
MLog2 -> Log2hml * (1 / (((Log2hml - MLog2) / MLog2) + 1));
|
170
|
+
MLogi -> Logihml * (1 / (((Logihml - MLogi) / MLogi) + 1));
|
171
|
+
|
172
|
+
T2hl -> (T2 * ((T2hl - T2) / T2)) + T2;
|
173
|
+
T3hl -> (T3 * ((T3hl - T3) / T3)) + T3;
|
174
|
+
T4hl -> (T4 * ((T4hl - T4) / T4)) + T4;
|
175
|
+
T5hl -> (T5 * ((T5hl - T5) / T5)) + T5;
|
176
|
+
T6hl -> (T6 * ((T6hl - T6) / T6)) + T6;
|
177
|
+
T7hl -> (T7 * ((T7hl - T7) / T7)) + T7;
|
178
|
+
T8hl -> (T8 * ((T8hl - T8) / T8)) + T8;
|
179
|
+
T9hl -> (T9 * ((T9hl - T9) / T9)) + T9;
|
180
|
+
T10hl -> (T10 * ((T10hl - T10) / T10)) + T10;
|
181
|
+
T11hl -> (T11 * ((T11hl - T11) / T11)) + T11;
|
182
|
+
T12hl -> (T12 * ((T12hl - T12) / T12)) + T12;
|
183
|
+
T13hl -> (T13 * ((T13hl - T13) / T13)) + T13;
|
184
|
+
T14hl -> (T14 * ((T14hl - T14) / T14)) + T14;
|
185
|
+
|
186
|
+
ZSquarehml -> (ZSquare * ((ZSquarehml - ZSquare) / ZSquare)) + ZSquare;
|
187
|
+
ZCubehml -> (ZCube * ((ZCubehml - ZCube) / ZCube)) + ZCube;
|
188
|
+
HigherPolyMultZhml -> (HigherPolyMultZ * ((HigherPolyMultZhml - HigherPolyMultZ) / HigherPolyMultZ)) + HigherPolyMultZ;
|
189
|
+
PolyWithSquarehml -> (PolyWithSquare * ((PolyWithSquarehml - PolyWithSquare) / PolyWithSquare)) + PolyWithSquare;
|
190
|
+
Polyhml -> (Poly * ((Polyhml - Poly) / Poly)) + Poly;
|
191
|
+
Logyhml -> (Logy * ((Logyhml - Logy) / Logy)) + Logy;
|
192
|
+
|
193
|
+
|
194
|
+
delta3 -> delta2 + (T2 * ((T2hl - T2) / T2));
|
195
|
+
delta4 -> Z * delta3 + T3 * ((T3hl - T3) / T3);
|
196
|
+
delta5 -> delta4 + (T4 * ((T4hl - T4) / T4));
|
197
|
+
delta6 -> Z * delta5 + T5 * ((T5hl - T5) / T5);
|
198
|
+
delta7 -> delta6 + (T6 * ((T6hl - T6) / T6));
|
199
|
+
delta8 -> Z * delta7 + T7 * ((T7hl - T7) / T7);
|
200
|
+
delta9 -> delta8 + (T8 * ((T8hl - T8) / T8));
|
201
|
+
delta10 -> Z * delta9 + T9 * ((T9hl - T9) / T9);
|
202
|
+
delta11 -> delta10 + (T10 * ((T10hl - T10) / T10));
|
203
|
+
delta12 -> Z * delta11 + T11 * ((T11hl - T11) / T11);
|
204
|
+
delta13 -> delta12 + (T12 * ((T12hl - T12) / T12));
|
205
|
+
delta14 -> Z * delta13 + T13 * ((T13hl - T13) / T13);
|
206
|
+
delta15 -> delta14 + (T14 * ((T14hl - T14) / T14));
|
207
|
+
delta16 -> Z*Z*((ZSquarehml - ZSquare) / ZSquare);
|
208
|
+
delta17 -> Z * delta16 + ZCube * ((ZCubehml - ZCube) / ZCube);
|
209
|
+
delta18 -> delta15 * delta17 + delta15 * MZCube + delta17 * MT14 +
|
210
|
+
HigherPolyMultZ * ((HigherPolyMultZhml - HigherPolyMultZ) / HigherPolyMultZ);
|
211
|
+
delta20 -> delta19 + delta18 + PolyWithSquare * ((PolyWithSquarehml - PolyWithSquare) / PolyWithSquare);
|
212
|
+
delta21 -> delta20 + Poly * ((Polyhml - Poly) / Poly);
|
213
|
+
delta22 -> delta25 + delta26 + Logy * ((Logyhml - Logy) / Logy);
|
214
|
+
delta26 -> delta21 + MLog1pZ * ((MPoly - MLog1pZ) / MLog1pZ);
|
215
|
+
delta24 -> delta23 + delta22 + Logover * ((Loghml - Logover) / Logover);
|
216
|
+
|
217
|
+
((logh + logm + logl) - MLog) / MLog -> ((Loghml - MLog) / MLog) + ((((logh + logm + logl) - Loghml) / Loghml) * (((Loghml - MLog) / MLog) + 1));
|
@@ -0,0 +1,156 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
|
4
|
+
log2h = <float64ne> (_log2h);
|
5
|
+
log2m = <float64ne> (_log2m);
|
6
|
+
log2l = <float64ne> (_log2l);
|
7
|
+
|
8
|
+
c3 = <float64ne> (_c3);
|
9
|
+
c4 = <float64ne> (_c4);
|
10
|
+
c5 = <float64ne> (_c5);
|
11
|
+
c6 = <float64ne> (_c6);
|
12
|
+
c7 = <float64ne> (_c7);
|
13
|
+
|
14
|
+
|
15
|
+
E = 1; #MAPLE
|
16
|
+
|
17
|
+
logih = <float64ne> (_logih);
|
18
|
+
logim = <float64ne> (_logim);
|
19
|
+
logil = <float64ne> (_logil);
|
20
|
+
|
21
|
+
|
22
|
+
zh = <float64ne> (Z);
|
23
|
+
zl = Z - zh; #MAPLE
|
24
|
+
|
25
|
+
polyHorner <float64ne>= c3 + zh * (c4 + zh * (c5 + zh * (c6 + zh * c7)));
|
26
|
+
|
27
|
+
ZhSquarehl = zh * zh; #MAPLE
|
28
|
+
zhSquareh = <float64ne> (ZhSquarehl);
|
29
|
+
zhSquarel = <float64ne> (ZhSquarehl - zhSquareh);
|
30
|
+
|
31
|
+
zhSquareHalfh = zhSquareh * (-0.5); #MAPLE
|
32
|
+
zhSquareHalfl = zhSquarel * (-0.5); #MAPLE
|
33
|
+
ZhSquareHalfhl = ZhSquarehl * (-0.5); #MAPLE
|
34
|
+
|
35
|
+
polyUpper <float64ne>= polyHorner * (zh * zhSquareh);
|
36
|
+
|
37
|
+
|
38
|
+
temp = <float64ne> (zh * zl);
|
39
|
+
T1hl = polyUpper - temp; #MAPLE
|
40
|
+
t1h = <float64ne> (T1hl);
|
41
|
+
t1l = <float64ne> (T1hl - t1h);
|
42
|
+
|
43
|
+
T2 = Z + ZhSquareHalfhl; #MAPLE
|
44
|
+
t2h = <float64ne> (T2hl);
|
45
|
+
t2l = <float64ne> (T2hl - t2h);
|
46
|
+
|
47
|
+
PE = T2hl + T1hl; #MAPLE
|
48
|
+
ph = <float64ne> (Phl);
|
49
|
+
pl = <float64ne> (Phl - ph);
|
50
|
+
|
51
|
+
Log2hed = E * log2h; #MAPLE
|
52
|
+
Log2med = E * log2m; #MAPLE
|
53
|
+
|
54
|
+
Log2edhm = Log2hed + Log2med; #MAPLE
|
55
|
+
log2edh = <float64ne> (Log2edhm);
|
56
|
+
log2edl = <float64ne> (Log2edhm - log2edh);
|
57
|
+
|
58
|
+
#Useful additional definitions
|
59
|
+
Log2hm = log2h + log2m; #MAPLE
|
60
|
+
Logihm = logih + logim; #MAPLE
|
61
|
+
#End additional
|
62
|
+
|
63
|
+
LogTabPoly = Logihm + Phl; #MAPLE
|
64
|
+
logTabPolyh = <float64ne> (LogTabPolyhl);
|
65
|
+
logTabPolyl = <float64ne> (LogTabPolyhl - logTabPolyh);
|
66
|
+
|
67
|
+
LogE = Log2edhm + LogTabPolyhl; #MAPLE
|
68
|
+
logh = <float64ne> (Loghm);
|
69
|
+
logm = <float64ne> (Loghm - logh);
|
70
|
+
|
71
|
+
#Mathematical definition of the logarithm and the polynomial
|
72
|
+
|
73
|
+
Phigher = (c3 + Z * (c4 + Z * (c5 + Z * (c6 + Z * c7)))); #MAPLE
|
74
|
+
ZZZ = Z*Z*Z; #MAPLE
|
75
|
+
ZZZPhigher = ZZZ * Phigher; #MAPLE
|
76
|
+
HZZ = (-0.5*Z*Z); #MAPLE
|
77
|
+
ZpHZZ = Z + HZZ; #MAPLE
|
78
|
+
P = ZpHZZ + ZZZPhigher; #MAPLE
|
79
|
+
Log2E = E * Log2; #MAPLE
|
80
|
+
Log1pZpTab = Log1pZ + Logir; #MAPLE
|
81
|
+
Log = Log2E + Log1pZpTab; #MAPLE
|
82
|
+
|
83
|
+
# Useful additional definitions
|
84
|
+
|
85
|
+
HZZsimp = HZZ + (zh * zl); #MAPLE
|
86
|
+
ZpHZZsimp = Z + HZZsimp; #MAPLE
|
87
|
+
ZZZPhigherPzhzl = ZZZPhigher - zh * zl; #MAPLE
|
88
|
+
zhCube = zh * zhSquareh; #MAPLE
|
89
|
+
|
90
|
+
delta1 = T2hl - T2; #MAPLE
|
91
|
+
delta2 = polyUpper - (polyHorner * zhCube); #MAPLE
|
92
|
+
delta3 = zhCube - ZZZ; #MAPLE
|
93
|
+
delta4 = Phl - PE; #MAPLE
|
94
|
+
delta5 = Loghm - LogE; #MAPLE
|
95
|
+
delta6 = P - Log1pZ; #MAPLE
|
96
|
+
delta7 = LogTabPolyhl - LogTabPoly; #MAPLE
|
97
|
+
|
98
|
+
# End additional
|
99
|
+
|
100
|
+
|
101
|
+
{
|
102
|
+
(T2hl - T2) / T2 in [-1b-103,1b-103]
|
103
|
+
/\ (Phl - PE) / PE in [-1b-103,1b-103]
|
104
|
+
/\ (LogTabPolyhl - LogTabPoly) / LogTabPoly in [-1b-103,1b-103]
|
105
|
+
/\ (Loghm - LogE) / LogE in [-1b-103,1b-103]
|
106
|
+
/\ (Log2hm - Log2) / Log2 in [-1b-84,1b-84]
|
107
|
+
/\ (Logihm - Logir) / Logir in [-1b-106,1b-106]
|
108
|
+
/\ Z in [_zmin,_zmax]
|
109
|
+
/\ (P - Log1pZ) / Log1pZ in [-_epsilonApproxQuick,_epsilonApproxQuick]
|
110
|
+
/\ ((logh + logm) - Loghm) / Loghm in [-1b-106,1b-106]
|
111
|
+
->
|
112
|
+
((logh + logm) - Log) / Log in [-5b-65,5b-65]
|
113
|
+
}
|
114
|
+
|
115
|
+
T2hl - T2 -> ((T2hl - T2) / T2) * T2;
|
116
|
+
T2hl -> (T2hl - T2) + T2;
|
117
|
+
|
118
|
+
Phl - PE -> ((Phl - PE) / PE) * PE;
|
119
|
+
Phl -> (Phl - PE) + PE;
|
120
|
+
|
121
|
+
|
122
|
+
LogTabPolyhl -> (LogTabPolyhl - LogTabPoly) + LogTabPoly;
|
123
|
+
|
124
|
+
Loghm -> (Loghm - LogE) + LogE;
|
125
|
+
|
126
|
+
Log2 -> Log2hm * (1 / (((Log2hm - Log2) / Log2) + 1));
|
127
|
+
|
128
|
+
Logir -> Logihm * (1 / (((Logihm - Logir) / Logir) + 1));
|
129
|
+
|
130
|
+
|
131
|
+
LogTabPolyhl - LogTabPoly -> ((LogTabPolyhl - LogTabPoly) / LogTabPoly) * LogTabPoly;
|
132
|
+
|
133
|
+
HZZsimp -> (-0.5 * zh * zh) - (0.5 * zl * zl);
|
134
|
+
|
135
|
+
T2hl - ZpHZZsimp -> (0.5 * zl * zl) + delta1;
|
136
|
+
|
137
|
+
zhCube - ZZZ -> (Z * (zhSquareh - Z * Z)) - (zl * zhSquareh);
|
138
|
+
|
139
|
+
polyUpper - ZZZPhigher -> ZZZ * (polyHorner - Phigher) + polyHorner * delta3 + delta2;
|
140
|
+
|
141
|
+
ZpHZZ + ZZZPhigher -> ZpHZZsimp + ZZZPhigherPzhzl;
|
142
|
+
|
143
|
+
Phl - P -> (T2hl - ZpHZZsimp) + (T1hl - ZZZPhigherPzhzl) + delta4;
|
144
|
+
|
145
|
+
Log1pZ -> P * (1 / (((P - Log1pZ) / Log1pZ) + 1));
|
146
|
+
P - Log1pZ -> ((P - Log1pZ) / Log1pZ) * Log1pZ;
|
147
|
+
|
148
|
+
Phl - Log1pZ -> (Phl - P) + delta6;
|
149
|
+
|
150
|
+
LogTabPolyhl - Log1pZpTab -> (Logihm - Logir) + (Phl - Log1pZ) + delta7;
|
151
|
+
|
152
|
+
Loghm - Log -> (Log2edhm - Log2E) + (LogTabPolyhl - Log1pZpTab) + delta5;
|
153
|
+
|
154
|
+
(logh + logm) - Loghm -> (((logh + logm) - Loghm) / Loghm) * Loghm;
|
155
|
+
|
156
|
+
(logh + logm) - Log -> ((logh + logm) - Loghm) + (Loghm - Log);
|
@@ -0,0 +1,204 @@
|
|
1
|
+
# Usage: You need to set the constants cah, cal, sah, sal. Running the trigo.mpl Maple script
|
2
|
+
# should create 64 files in TEMPTRIG, which can be tested independently as
|
3
|
+
# sed -f TEMPTRIG/SinACosA_1.sed trigoSinCosCase3.gappa | ~/gappa/src/gappa > /dev/null
|
4
|
+
|
5
|
+
# NOTATION CONVENTION
|
6
|
+
# Variables that correspond to double-precision variables in the code begin with a small letter
|
7
|
+
# Other variables begin with a capital letter.
|
8
|
+
# Variables that will be replaced with Maple-computed constants begin with an underscore
|
9
|
+
# Otherwise avoid underscores as they are painful to carry on to LaTeX :)
|
10
|
+
|
11
|
+
# polynomial coefficients, computed by Maple
|
12
|
+
s3 = <float64ne>(_s3);
|
13
|
+
s5 = <float64ne>(_s5);
|
14
|
+
s7 = <float64ne>(_s7);
|
15
|
+
c2 = <float64ne>(_c2);
|
16
|
+
c4 = <float64ne>(_c4);
|
17
|
+
c6 = <float64ne>(_c6);
|
18
|
+
|
19
|
+
# Table values, computed by Maple
|
20
|
+
cah = <float64ne>(_cah);
|
21
|
+
cal = <float64ne>(_cal);
|
22
|
+
sah = <float64ne>(_sah);
|
23
|
+
sal = <float64ne>(_sal);
|
24
|
+
|
25
|
+
# The variables used here:
|
26
|
+
# x input
|
27
|
+
# Y perfect reduced argument
|
28
|
+
# Ydd = yh+yl, his distance to Y is specified as an hypothesis
|
29
|
+
# TsHat perfect ts
|
30
|
+
# TcHat perfect tc
|
31
|
+
# SinX exact result for sin(x)
|
32
|
+
# SinA, CosA perfect sin(kPi/256) and cos(kPi/256)
|
33
|
+
|
34
|
+
|
35
|
+
yh = <float64ne>(Ydd);
|
36
|
+
yl = Ydd - yh;
|
37
|
+
|
38
|
+
#######################################################################
|
39
|
+
|
40
|
+
# First, a transcription of the actual computation, which could (and
|
41
|
+
# should eventually) be generated automatically from the actual code
|
42
|
+
|
43
|
+
# ---------------------Code shared by sin and cos, cut from ComputeTrigWithArgRed :
|
44
|
+
yh2 <float64ne>= yh * yh;
|
45
|
+
ts <float64ne>= yh2 * (s3 + yh2*(s5 + yh2*s7));
|
46
|
+
tc <float64ne>= yh2 * (c2 + yh2*(c4 + yh2*c6));
|
47
|
+
|
48
|
+
# ---------------------Code for the sine, cut from DosinNotZero:
|
49
|
+
# Mul12(&cahyh_h,&cahyh_l, cah, yh);
|
50
|
+
cahyh = cah * yh;
|
51
|
+
cahyh_h = <float64ne>(cahyh);
|
52
|
+
cahyh_l = cahyh - cahyh_h; # Exact equation because Mul12 is exact
|
53
|
+
|
54
|
+
# Add12(thi, tlo, sah, cahyh_h);
|
55
|
+
TSin = sah + cahyh_h;
|
56
|
+
thiSin = <float64ne>(TSin);
|
57
|
+
tloSin1 = TSin - thiSin; # Exact equation because Add12 is exact
|
58
|
+
|
59
|
+
# Rem: need to Rename tlo to tloSin1, and its second use to tloSin2.
|
60
|
+
# It would be safer to translate code to single-assignment before
|
61
|
+
# using Gappa, modern compilers won't make any difference.
|
62
|
+
|
63
|
+
# tlo = tc*sah+(ts*cahyh_h+(sal+(tlo+(cahyh_l+(cal*yh + cah*yl))))) ;
|
64
|
+
tloSin2 <float64ne>= tc*sah + (ts*cahyh_h + (sal + (tloSin1 + (cahyh_l + (cal*yh + cah*yl)))));
|
65
|
+
|
66
|
+
# Add12(*reshi, *reslo, thi, tlo);
|
67
|
+
ResultSin = thiSin + tloSin2; # we don't need to split it for the proof.
|
68
|
+
|
69
|
+
|
70
|
+
# ---------------------Code for the cos, cut from DoCosNotZero:
|
71
|
+
# Mul12(&sahyh_h,&sahyh_l, sah, yh);
|
72
|
+
sahyh = sah * yh;
|
73
|
+
sahyh_h = <float64ne>(sahyh);
|
74
|
+
sahyh_l = sahyh - sahyh_h; # Exact equation because Mul12 is exact
|
75
|
+
|
76
|
+
# Add12(thi, tlo, cah, -sahyh_h);
|
77
|
+
TCos = cah - sahyh_h;
|
78
|
+
thiCos = <float64ne>(TCos);
|
79
|
+
tloCos1 = TCos - thiCos; # Exact equation because Add12 is exact
|
80
|
+
|
81
|
+
# tlo = tc*sah+(ts*cahyh_h+(sal+(tlo+(cahyh_l+(cal*yh + cah*yl))))) ;
|
82
|
+
tloCos2 <float64ne>= tc*cah-(ts*sahyh_h-(cal+(tloCos1-(sahyh_l+(sal*yh+sah*yl))))) ;
|
83
|
+
|
84
|
+
# Add12(*pch, *pcl, thi, tlo);
|
85
|
+
ResultCos = thiCos + tloCos2; # No need to split it for the proof.
|
86
|
+
|
87
|
+
|
88
|
+
#######################################################################
|
89
|
+
|
90
|
+
# Now let us pile up layers of approximations
|
91
|
+
|
92
|
+
#-------------------------------------
|
93
|
+
#With these notations, the exact sine and cosine are given by these
|
94
|
+
#exact mathematical formulae
|
95
|
+
|
96
|
+
SinX = SinY * CosA + CosY * SinA;
|
97
|
+
CosX = CosY * CosA - SinY * SinA;
|
98
|
+
|
99
|
+
#-------------------------------------
|
100
|
+
# yh2 is an approximation to :
|
101
|
+
Y2 = Y*Y;
|
102
|
+
# through three layers:
|
103
|
+
# 1/ Ydd=yh+hl = Y +/- delta_ArgRed : in the hypotheses below
|
104
|
+
# 2/ yh = Ydd - yl : already written
|
105
|
+
# 3/ rounding error in the mult : already written
|
106
|
+
|
107
|
+
#-------------------------------------
|
108
|
+
# ts is an approximation to :
|
109
|
+
TsHat = Y2 * (s3 + Y2*(s5 + Y2*s7));
|
110
|
+
# through two layers:
|
111
|
+
# 1/ the approximation y2 of Y2 : done just above
|
112
|
+
# 2/ the rounding errors in Horner : already written
|
113
|
+
|
114
|
+
#-------------------------------------
|
115
|
+
PolySinY = Y * (1 + TsHat);
|
116
|
+
# PolySinY is an approximation to sin(Y) as expressed in the hypotheses below :
|
117
|
+
# PolySinY - SinY in [-0.24126e-23, 0.24126e-23] # delta_approx_Sin_Case3
|
118
|
+
|
119
|
+
#-------------------------------------
|
120
|
+
# Same for PolyCosY
|
121
|
+
TcHat = Y2 * (c2 +(Y2 * (c4 + (Y2 * c6))));
|
122
|
+
PolyCosY = 1 + TcHat;
|
123
|
+
|
124
|
+
#-------------------------------------
|
125
|
+
#tc is an approximation to TcHat through the rounding errors, defined
|
126
|
+
#in the definition of tc. Same for ts
|
127
|
+
|
128
|
+
#-------------------------------------
|
129
|
+
# SinReconstrExact is an approximation to ResultSin
|
130
|
+
SinReconstrExact = PolySinY * CosA + PolyCosY * SinA ;
|
131
|
+
# The delta between ResultSin and SinReconstrExact is due to the two
|
132
|
+
# mathematical poly approx, and has been defined just above
|
133
|
+
CosReconstrExact = PolyCosY * CosA - PolySinY * SinA ;
|
134
|
+
|
135
|
+
#-------------------------------------
|
136
|
+
# The reconstruction approximates the following
|
137
|
+
SinReconstrNoRound = Ydd*(1 + ts)*(cah+cal) + (1 + tc)*(sah+sal);
|
138
|
+
# where Ydd is an approximation to Y
|
139
|
+
# ts is an approximation to TsHat
|
140
|
+
# tc is an approximation to TcHat : all already described
|
141
|
+
# All what we still need to express is that the actual computation will neglect some terms
|
142
|
+
CosReconstrNoRound = ( (1 + tc) * (cah+cal) - Ydd * (1 + ts) * (sah+sal) );
|
143
|
+
|
144
|
+
#-------------------------------------
|
145
|
+
# tloSin2 is an approximation to TloSin2NoRound (because of rounding error in the operations, already described)
|
146
|
+
TloSin2NoRound = tc*sah+(ts*cahyh_h+(sal+(tloSin1+(cahyh_l+(cal*yh+cah*yl))))) ;
|
147
|
+
TloCos2NoRound = tc*cah-(ts*sahyh_h-(cal+(tloCos1-(sahyh_l+(sal*yh+sah*yl)))));
|
148
|
+
|
149
|
+
# tloSinNoRound is an approximation to SinReconstrNoRound - tSinhi, the
|
150
|
+
# difference being the neglected terms. This error will be given as an hint
|
151
|
+
|
152
|
+
NeglectedSinTerms = SinReconstrNoRound - (thiSin + TloSin2NoRound);
|
153
|
+
NeglectedCosTerms = CosReconstrNoRound - (thiCos + TloCos2NoRound);
|
154
|
+
|
155
|
+
# And finally, ResultSin is an approximation to SinX through many layers which are given in the hints.
|
156
|
+
|
157
|
+
###########################################################################################
|
158
|
+
# The theorem to prove
|
159
|
+
{
|
160
|
+
Ydd in [-_ymaxCase3, _ymaxCase3] # computed by Maple
|
161
|
+
/\ Ydd - Y in [-_delta_ArgRed, _delta_ArgRed] # computed by Maple
|
162
|
+
/\ PolySinY - SinY in [-_delta_approx_Sin_Case3, _delta_approx_Sin_Case3] # computed by Maple
|
163
|
+
/\ PolyCosY - CosY in [-_delta_approx_Cos_Case3, _delta_approx_Cos_Case3] # computed by Maple
|
164
|
+
/\ SinA-sah-sal in [-1b-104, 1b-104]
|
165
|
+
/\ CosA-cah-cal in [-1b-104, 1b-104] # double-double absolute rounding error, with margin
|
166
|
+
|
167
|
+
->
|
168
|
+
|
169
|
+
(ResultSin - SinX)/SinX in [-3b-66,3b-66]
|
170
|
+
/\
|
171
|
+
(ResultCos - CosX)/CosX in [-3b-66,3b-66]
|
172
|
+
|
173
|
+
|
174
|
+
}
|
175
|
+
|
176
|
+
#(ResultSin - SinX)/SinX $ SinX;
|
177
|
+
|
178
|
+
###########################################################################################
|
179
|
+
# Hints to the reduction engine: Gappa is not supposed to be clever, it's an assistant
|
180
|
+
|
181
|
+
# To get bounds on SinX, try ResultSin
|
182
|
+
SinX -> ResultSin - (ResultSin - SinX);
|
183
|
+
CosX -> ResultCos - (ResultCos - CosX);
|
184
|
+
|
185
|
+
# To get bounds on SinA, try sah+sal
|
186
|
+
SinA -> sah + sal + (SinA - sah - sal);
|
187
|
+
CosA -> cah + cal + (CosA - cah - cal);
|
188
|
+
|
189
|
+
# To get bounds on Y, try Ydd
|
190
|
+
Y -> Ydd - (Ydd - Y);
|
191
|
+
|
192
|
+
# One layer of approx error, and one layer of rounding error for SinY and CosY
|
193
|
+
1 + tc - CosY -> (1 + tc - PolyCosY) + (PolyCosY - CosY);
|
194
|
+
(Y + Y * ts) - SinY -> ((Y + Y * ts) - PolySinY) + (PolySinY - SinY);
|
195
|
+
|
196
|
+
# Layers of approximations
|
197
|
+
ResultSin - SinX -> (ResultSin - SinReconstrNoRound) + (SinReconstrNoRound - SinReconstrExact) + (SinReconstrExact - SinX);
|
198
|
+
ResultCos - CosX -> (ResultCos - CosReconstrNoRound) + (CosReconstrNoRound - CosReconstrExact) + (CosReconstrExact - CosX);
|
199
|
+
|
200
|
+
NeglectedSinTerms -> sal*tc + cal*yl + ts*(cahyh_l + cah*yl + cal*yh + cal*yl);
|
201
|
+
ResultSin - SinReconstrNoRound -> (ResultSin - (thiSin + TloSin2NoRound)) - (SinReconstrNoRound - (thiSin + TloSin2NoRound)) ;
|
202
|
+
|
203
|
+
NeglectedCosTerms -> cal*tc - sal*yl - ts*(sahyh_l + sah*yl + sal*yh + sal*yl);
|
204
|
+
ResultCos - CosReconstrNoRound -> (ResultCos - (thiCos + TloCos2NoRound)) - (CosReconstrNoRound - (thiCos + TloCos2NoRound)) ;
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# Usage: You need to replace a few constants (beginning by _) by numerical
|
2
|
+
# values. Running the trigo.mpl Maple script will generate a
|
3
|
+
# TEMPTRIG/tanCase2.sed sed script that does it.
|
4
|
+
# Then sed -f TEMPTRIG/TanCase2.sed trigoTanCase2.gappa | gappa > /dev/null
|
5
|
+
|
6
|
+
|
7
|
+
# NOTATION CONVENTION
|
8
|
+
# Variables that correspond to double-precision variables in the code begin with a small letter
|
9
|
+
# Other variables begin with a capital letter.
|
10
|
+
# Otherwise avoid underscores as they are painful to carry on to LaTeX :)
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
# Definition of the polynomial constants:
|
15
|
+
t11 = <float64ne>(_t11);
|
16
|
+
t9 = <float64ne>(_t9);
|
17
|
+
t7 = <float64ne>(_t7);
|
18
|
+
t5 = <float64ne>(_t5);
|
19
|
+
t3h = <float64ne>(_t3h);
|
20
|
+
t3l = <float64ne>(_t3l);
|
21
|
+
|
22
|
+
#######################################################################
|
23
|
+
|
24
|
+
# First, a transcription of the actual computation, which could (and
|
25
|
+
# should eventually) be generated automatically from the actual code
|
26
|
+
|
27
|
+
# ---------------------Code cut from tan_rn :
|
28
|
+
# x2 = x*x;
|
29
|
+
x2 <float64ne>= x * x;
|
30
|
+
X2 = x*x;
|
31
|
+
|
32
|
+
# p5 = t5 + x2*(t7 + x2*(t9 + x2*t11));
|
33
|
+
p5 <float64ne>= t5 + x2*(t7 + x2*(t9 + x2*t11));
|
34
|
+
P5 = t5 + X2*(t7 + X2*(t9 + X2*t11));
|
35
|
+
|
36
|
+
# tt = x2*(t3h + (t3l + x2*p5));
|
37
|
+
tt <float64ne>= x2*(t3h + (t3l + x2*p5));
|
38
|
+
Tt = X2*(t3h + (t3l + X2*p5));
|
39
|
+
|
40
|
+
# Add12(rri.rh, rri.rl, x, x*tt);
|
41
|
+
rdd = x + <float64ne>(x*tt); # The Add12 is exact
|
42
|
+
|
43
|
+
Poly = x+x*Tt;
|
44
|
+
|
45
|
+
epsilon=(rdd - TanX)/TanX;
|
46
|
+
|
47
|
+
{
|
48
|
+
x in [1b-30, _xmax]
|
49
|
+
/\ (Poly - TanX)/TanX in [-_maxEpsApprox, _maxEpsApprox]
|
50
|
+
/\ ((Poly - TanX)/TanX)/x in [-_maxEpsApproxOverX, _maxEpsApproxOverX]
|
51
|
+
|
52
|
+
->
|
53
|
+
|
54
|
+
epsilon in ?
|
55
|
+
/\
|
56
|
+
epsilon/x in [-1b-56,1b-56]
|
57
|
+
|
58
|
+
}
|
59
|
+
|
60
|
+
# Use a dichotomy on x to get an interval of epsilon/x
|
61
|
+
epsilon/x $ x;
|
62
|
+
|
63
|
+
# The usual hint for relative errors, with an additional /x*x so that Gappa uses the Maple-computed mathematical bound
|
64
|
+
(rdd - TanX)/TanX -> (rdd - Poly)/Poly + (((Poly - TanX)/TanX)/x)*x + ((rdd - Poly)/Poly) * ((Poly - TanX)/TanX) ;
|
65
|
+
|
66
|
+
(rdd - Poly)/Poly -> ((<float64ne>(x*tt) - x*Tt) / x) * (x/Poly);
|
67
|
+
|
68
|
+
# I'm not sure I understand why this one improves the result
|
69
|
+
(<float64ne>(x*tt) - x*Tt)/x -> ((<float64ne>(x*tt) - x*tt)/(x*tt)) * tt + (tt - Tt);
|
70
|
+
|
71
|
+
# Easy hints
|
72
|
+
x/Poly -> 1/(Poly/x);
|
73
|
+
Poly/x -> 1+Tt;
|