intervals 0.3.56
Sign up to get free protection for your applications and to get access to all the features.
- 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,627 @@
|
|
1
|
+
#include <stdio.h>
|
2
|
+
#include <stdlib.h>
|
3
|
+
#include <string.h>
|
4
|
+
#include <math.h>
|
5
|
+
#include "crlibm.h"
|
6
|
+
#include "crlibm_private.h"
|
7
|
+
#include "test_common.h"
|
8
|
+
|
9
|
+
#ifdef HAVE_MPFR_H
|
10
|
+
#include <gmp.h>
|
11
|
+
#include <mpfr.h>
|
12
|
+
#endif
|
13
|
+
|
14
|
+
#ifdef HAVE_MATHLIB_H
|
15
|
+
#include <MathLib.h>
|
16
|
+
#endif
|
17
|
+
|
18
|
+
#ifdef HAVE_LIBMCR_H
|
19
|
+
#include <libmcr.h>
|
20
|
+
#endif
|
21
|
+
|
22
|
+
|
23
|
+
/* A variable equal to zero, stored here so that the compiler doesn't
|
24
|
+
know its value in the other functions, which allows to prevent some
|
25
|
+
optimizations */
|
26
|
+
|
27
|
+
|
28
|
+
#define RN 1
|
29
|
+
#define RU 2
|
30
|
+
#define RD 3
|
31
|
+
#define RZ 4
|
32
|
+
|
33
|
+
double zero ;
|
34
|
+
|
35
|
+
/* Here come the various random number generators. They all use the
|
36
|
+
rand() function.
|
37
|
+
|
38
|
+
We may have two rand functions for each function under
|
39
|
+
test. The first is for the soaktest, the second for testing the
|
40
|
+
performance under what is supposed the main domain of use the function.
|
41
|
+
|
42
|
+
Typical examples:
|
43
|
+
|
44
|
+
log has identical functions for soaktest and performance: random
|
45
|
+
positive numbers. This means that negative numbers are not tested
|
46
|
+
by soaktest, though.
|
47
|
+
|
48
|
+
sin soaktests on all the floats, but tests for perf on a small
|
49
|
+
interval around zero, shamelessely chosen as the one on which crlibm
|
50
|
+
is the fastest.
|
51
|
+
*/
|
52
|
+
|
53
|
+
|
54
|
+
/**/
|
55
|
+
|
56
|
+
|
57
|
+
/* Return 'sizeof(int)' random bits */
|
58
|
+
int rand_int(){
|
59
|
+
int val;
|
60
|
+
int i;
|
61
|
+
val = (random() & 0x000000ff);
|
62
|
+
for(i=0; i<(sizeof(int)); i++){
|
63
|
+
val = val << 8;
|
64
|
+
val += (random() & 0x000000ff ); /* we keep only 8 bits */
|
65
|
+
}
|
66
|
+
return val;
|
67
|
+
}
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
|
72
|
+
/* Return a completely random double */
|
73
|
+
|
74
|
+
double rand_generic(){
|
75
|
+
db_number result;
|
76
|
+
|
77
|
+
result.i[LO]=rand_int();
|
78
|
+
result.i[HI]=rand_int();
|
79
|
+
|
80
|
+
return result.d;
|
81
|
+
}
|
82
|
+
|
83
|
+
|
84
|
+
/* Return a random double between 0 and 1, with a normal law on the
|
85
|
+
exponent */
|
86
|
+
|
87
|
+
double rand_double(){
|
88
|
+
db_number result;
|
89
|
+
int e;
|
90
|
+
/*first the low bits of the mantissa*/
|
91
|
+
result.i[LO]=rand_int();
|
92
|
+
/* then the high bits of the mantissa, and the sign bit */
|
93
|
+
result.i[HI]= rand_int() & 0x000fffff;
|
94
|
+
/* Now set the exponent (negative value) */
|
95
|
+
e = rand() & 0x000003ff;
|
96
|
+
if (e>0) e-=1;
|
97
|
+
result.i[HI] += e<<20;
|
98
|
+
return (result.d);
|
99
|
+
}
|
100
|
+
|
101
|
+
|
102
|
+
/* Return a random double between 1 and 2, with a normal law on the
|
103
|
+
mantissa and a constant exponent */
|
104
|
+
|
105
|
+
double rand_double_normal(){
|
106
|
+
db_number result;
|
107
|
+
int e;
|
108
|
+
/*first the low bits of the mantissa*/
|
109
|
+
result.i[LO]=rand_int();
|
110
|
+
/* then the high bits of the mantissa, and the sign bit */
|
111
|
+
result.i[HI]= rand_int() & 0x000fffff;
|
112
|
+
/* Now set the exponent */
|
113
|
+
e = 1023;
|
114
|
+
result.i[HI] += e<<20;
|
115
|
+
return (result.d);
|
116
|
+
}
|
117
|
+
|
118
|
+
|
119
|
+
|
120
|
+
/* For exp we will test perf on numbers with a random sign, a random mantissa, and
|
121
|
+
a random exponent between -9 and 9. And we soaktest on all the doubles */
|
122
|
+
|
123
|
+
#define rand_for_exp_soaktest rand_generic
|
124
|
+
|
125
|
+
double rand_for_exp_perf(){
|
126
|
+
db_number result;
|
127
|
+
int e;
|
128
|
+
|
129
|
+
/*first the low bits of the mantissa*/
|
130
|
+
result.i[LO]=rand_int();
|
131
|
+
/* then the high bits of the mantissa, and the sign bit */
|
132
|
+
result.i[HI]= rand_int() & 0x800fffff;
|
133
|
+
/* Now set the exponent between -9 and 9, enough to cover the useful range */
|
134
|
+
e = (int) ( (rand_double_normal()-1) * 18 );
|
135
|
+
result.i[HI] += (1023 + e -9)<<20;
|
136
|
+
return result.d;
|
137
|
+
}
|
138
|
+
|
139
|
+
|
140
|
+
/* a number in the range which never produces over/underflow for the
|
141
|
+
exp function. I don't trust the randomness of this function */
|
142
|
+
double rand_for_exp_normal(){
|
143
|
+
return((750+710)*(rand_double_normal()-1)-750);
|
144
|
+
}
|
145
|
+
|
146
|
+
|
147
|
+
|
148
|
+
|
149
|
+
|
150
|
+
#define rand_for_csh_perf rand_for_exp_perf
|
151
|
+
/* I wish we could soaktest using rand_generic, but current MPFR is
|
152
|
+
very slow for small and large arguments (up to a few minutes per
|
153
|
+
call !). To check regularly, this is bound to improve. */
|
154
|
+
|
155
|
+
#define rand_for_csh_soaktest rand_for_exp_perf
|
156
|
+
|
157
|
+
/* For log we only test the positive numbers*/
|
158
|
+
double rand_for_log(){
|
159
|
+
db_number result;
|
160
|
+
|
161
|
+
/*first the low bits of the mantissa*/
|
162
|
+
result.i[LO]=rand_int();
|
163
|
+
/* then the high bits of the mantissa, and the sign bit */
|
164
|
+
result.i[HI]= rand_int() & 0x7fffffff;
|
165
|
+
/* printf("x = %1.5e\n", result.d);*/
|
166
|
+
return result.d;
|
167
|
+
}
|
168
|
+
|
169
|
+
|
170
|
+
/* For trigonometric functions it is difficult to tell what the test function should be */
|
171
|
+
|
172
|
+
double rand_for_trig_perf(){
|
173
|
+
db_number result;
|
174
|
+
int e;
|
175
|
+
/*first the low bits of the mantissa*/
|
176
|
+
result.i[LO]=rand_int();
|
177
|
+
/* then the high bits of the mantissa, and the sign bit */
|
178
|
+
result.i[HI]= rand_int() & 0x800fffff;
|
179
|
+
/* Now set the exponent between -20 and 40 */
|
180
|
+
e = (int) ( (rand_double_normal()-1) * 60 );
|
181
|
+
result.i[HI] += (1023 + e -20)<<20;
|
182
|
+
return result.d;
|
183
|
+
|
184
|
+
}
|
185
|
+
|
186
|
+
#if 0
|
187
|
+
#define rand_for_trig_soaktest rand_generic
|
188
|
+
#else
|
189
|
+
#define rand_for_trig_soaktest rand_for_trig_perf
|
190
|
+
#endif
|
191
|
+
|
192
|
+
double rand_for_atan_perf(){
|
193
|
+
db_number result;
|
194
|
+
int e;
|
195
|
+
/*first the low bits of the mantissa*/
|
196
|
+
result.i[LO]=rand_int();
|
197
|
+
/* then the high bits of the mantissa, and the sign bit */
|
198
|
+
result.i[HI]= rand_int() & 0x800fffff;
|
199
|
+
/* Now set the exponent between -20 and 50, enough to cover the useful range */
|
200
|
+
e = (int) ( (rand_double_normal()-1) * 70 );
|
201
|
+
result.i[HI] += (1023 + e -20)<<20;
|
202
|
+
return result.d;
|
203
|
+
|
204
|
+
}
|
205
|
+
|
206
|
+
double rand_for_atan_soaktest(){
|
207
|
+
db_number result;
|
208
|
+
int e;
|
209
|
+
|
210
|
+
/*first the low bits of the mantissa*/
|
211
|
+
result.i[LO]=rand_int();
|
212
|
+
/* then the high bits of the mantissa, and the sign bit */
|
213
|
+
result.i[HI]= rand_int() & 0x800fffff;
|
214
|
+
/* Now set the exponent between -20 and 50, enough to cover the useful range */
|
215
|
+
e = (int) ( (rand_double_normal()-1) * 70 );
|
216
|
+
result.i[HI] += (1023 + e -20)<<20;
|
217
|
+
return result.d;
|
218
|
+
|
219
|
+
}
|
220
|
+
|
221
|
+
/* For pow we need to test the whole range of floating point numbers
|
222
|
+
* However these definition should be slightly modified (keep x^y fp).
|
223
|
+
*/
|
224
|
+
#define rand_for_pow_soaktest rand_for_exp_perf
|
225
|
+
|
226
|
+
double rand_for_pow_perf(){
|
227
|
+
db_number result;
|
228
|
+
int e;
|
229
|
+
|
230
|
+
/*first the low bits of the mantissa*/
|
231
|
+
result.i[LO]=rand_int();
|
232
|
+
/* then the high bits of the mantissa, and the sign bit */
|
233
|
+
result.i[HI]= rand_int() & 0x800fffff;
|
234
|
+
/* Now set the exponent between -7 and 7,
|
235
|
+
enough to cover the useful range (does not overflow) */
|
236
|
+
e = (int) ( (rand_double_normal()-1) * 14 );
|
237
|
+
result.i[HI] += (1023 + e -7)<<20;
|
238
|
+
return result.d;
|
239
|
+
}
|
240
|
+
|
241
|
+
|
242
|
+
|
243
|
+
|
244
|
+
void test_rand() {
|
245
|
+
int i;
|
246
|
+
double min=1e300, max=0.0;
|
247
|
+
db_number input;
|
248
|
+
for(i=0; i< 1000; i++){
|
249
|
+
input.d = rand_for_exp_perf();
|
250
|
+
if (input.d<min) min=input.d;
|
251
|
+
if (input.d>max) max=input.d;
|
252
|
+
printf("%1.5ex \t%.8x %.8x\t%1.5e \t%1.5e\n", input.d, input.i[HI], input.i[LO],min,max );
|
253
|
+
}
|
254
|
+
}
|
255
|
+
|
256
|
+
|
257
|
+
|
258
|
+
|
259
|
+
|
260
|
+
/* general init function */
|
261
|
+
|
262
|
+
|
263
|
+
void test_init(/* pointers to returned value */
|
264
|
+
double (**randfun_perf)(),
|
265
|
+
double (**randfun_soaktest)(),
|
266
|
+
double (**testfun_crlibm)(),
|
267
|
+
int (**testfun_mpfr) (),
|
268
|
+
double (**testfun_libultim) (),
|
269
|
+
double (**testfun_libmcr) (),
|
270
|
+
double (**testfun_libm) (),
|
271
|
+
double* worst_case,
|
272
|
+
/* arguments */
|
273
|
+
char *func_name,
|
274
|
+
char *rnd_mode) {
|
275
|
+
|
276
|
+
int crlibm_rnd_mode;
|
277
|
+
|
278
|
+
/* We have added the rounding mode designation used in libmcr's test files */
|
279
|
+
if ((strcmp(rnd_mode,"RU")==0) || (strcmp(rnd_mode,"P")==0)) crlibm_rnd_mode = RU;
|
280
|
+
else if ((strcmp(rnd_mode,"RD")==0) || (strcmp(rnd_mode,"M")==0)) crlibm_rnd_mode = RD;
|
281
|
+
else if ((strcmp(rnd_mode,"RZ")==0) || (strcmp(rnd_mode,"Z")==0)) crlibm_rnd_mode = RZ;
|
282
|
+
else if ((strcmp(rnd_mode,"RN")==0) || (strcmp(rnd_mode,"N")==0)) crlibm_rnd_mode = RN;
|
283
|
+
else {
|
284
|
+
fprintf(stderr, "Unknown rounding mode: %s, exiting\n", rnd_mode);
|
285
|
+
exit(EXIT_FAILURE);
|
286
|
+
}
|
287
|
+
|
288
|
+
|
289
|
+
*randfun_perf = rand_generic; /* the default random function */
|
290
|
+
*randfun_soaktest = rand_generic; /* the default random function */
|
291
|
+
*testfun_mpfr = NULL;
|
292
|
+
*testfun_libm = NULL;
|
293
|
+
*worst_case=0.;
|
294
|
+
|
295
|
+
if (strcmp (func_name, "exp") == 0)
|
296
|
+
{
|
297
|
+
*randfun_perf = rand_for_exp_perf;
|
298
|
+
*randfun_soaktest = rand_for_exp_soaktest;
|
299
|
+
*worst_case= .75417527749959590085206221024712557043923055744016892276704311370849609375e-9;
|
300
|
+
*testfun_libm = exp;
|
301
|
+
switch(crlibm_rnd_mode){
|
302
|
+
case RU:
|
303
|
+
*testfun_crlibm = exp_ru; break;
|
304
|
+
case RD:
|
305
|
+
*testfun_crlibm = exp_rd; break;
|
306
|
+
case RZ:
|
307
|
+
*testfun_crlibm = exp_rz; break;
|
308
|
+
default:
|
309
|
+
*testfun_crlibm = exp_rn;
|
310
|
+
}
|
311
|
+
#ifdef HAVE_MATHLIB_H
|
312
|
+
*testfun_libultim = uexp;
|
313
|
+
#endif
|
314
|
+
#ifdef HAVE_LIBMCR_H
|
315
|
+
*testfun_libmcr = __libmcr_exp;
|
316
|
+
#endif
|
317
|
+
#ifdef HAVE_MPFR_H
|
318
|
+
*testfun_mpfr = mpfr_exp;
|
319
|
+
#endif
|
320
|
+
}
|
321
|
+
|
322
|
+
|
323
|
+
else if (strcmp (func_name, "log") == 0)
|
324
|
+
{
|
325
|
+
*randfun_perf = rand_for_log;
|
326
|
+
*randfun_soaktest = rand_for_log;
|
327
|
+
*worst_case=0.4009793462309855760053830468258630076242931610568335144339734234840014178511334897967240437927437320e-115;
|
328
|
+
*testfun_libm = log;
|
329
|
+
switch(crlibm_rnd_mode){
|
330
|
+
case RU:
|
331
|
+
*testfun_crlibm = log_ru; break;
|
332
|
+
case RD:
|
333
|
+
*testfun_crlibm = log_rd; break;
|
334
|
+
case RZ:
|
335
|
+
*testfun_crlibm = log_rz; break;
|
336
|
+
default:
|
337
|
+
*testfun_crlibm = log_rn;
|
338
|
+
}
|
339
|
+
#ifdef HAVE_MATHLIB_H
|
340
|
+
*testfun_libultim = ulog;
|
341
|
+
#endif
|
342
|
+
#ifdef HAVE_LIBMCR_H
|
343
|
+
*testfun_libmcr = __libmcr_log;
|
344
|
+
#endif
|
345
|
+
#ifdef HAVE_MPFR_H
|
346
|
+
*testfun_mpfr = mpfr_log;
|
347
|
+
#endif
|
348
|
+
}
|
349
|
+
|
350
|
+
else if (strcmp (func_name, "log2") == 0)
|
351
|
+
{
|
352
|
+
*randfun_perf = rand_for_log;
|
353
|
+
*randfun_soaktest = rand_for_log;
|
354
|
+
*worst_case=1.23; /* TODO: I dont know the worst case now */
|
355
|
+
*testfun_libm = log2;
|
356
|
+
switch(crlibm_rnd_mode){
|
357
|
+
case RU:
|
358
|
+
*testfun_crlibm = log2_ru; break;
|
359
|
+
case RD:
|
360
|
+
*testfun_crlibm = log2_rd; break;
|
361
|
+
case RZ:
|
362
|
+
*testfun_crlibm = log2_rz; break;
|
363
|
+
default:
|
364
|
+
*testfun_crlibm = log2_rn;
|
365
|
+
}
|
366
|
+
#ifdef HAVE_MATHLIB_H
|
367
|
+
*testfun_libultim = ulog2;
|
368
|
+
#endif
|
369
|
+
#ifdef HAVE_LIBMCR_H
|
370
|
+
*testfun_libmcr = __libmcr_log2;
|
371
|
+
#endif
|
372
|
+
#ifdef HAVE_MPFR_H
|
373
|
+
*testfun_mpfr = mpfr_log2;
|
374
|
+
#endif
|
375
|
+
}
|
376
|
+
|
377
|
+
else if (strcmp (func_name, "log10") == 0)
|
378
|
+
{
|
379
|
+
*randfun_perf = rand_for_log;
|
380
|
+
*randfun_soaktest = rand_for_log;
|
381
|
+
*worst_case = 2.60575359533670695497442621444820894404798523211076e+129;
|
382
|
+
*testfun_libm = log10;
|
383
|
+
switch(crlibm_rnd_mode){
|
384
|
+
case RU:
|
385
|
+
*testfun_crlibm = log10_ru; break;
|
386
|
+
case RD:
|
387
|
+
*testfun_crlibm = log10_rd; break;
|
388
|
+
case RZ:
|
389
|
+
*testfun_crlibm = log10_rz; break;
|
390
|
+
default:
|
391
|
+
*testfun_crlibm = log10_rn;
|
392
|
+
}
|
393
|
+
#ifdef HAVE_MATHLIB_H
|
394
|
+
*testfun_libultim = ulog10;
|
395
|
+
#endif
|
396
|
+
#ifdef HAVE_LIBMCR_H
|
397
|
+
*testfun_libmcr = __libmcr_log10;
|
398
|
+
#endif
|
399
|
+
#ifdef HAVE_MPFR_H
|
400
|
+
*testfun_mpfr = mpfr_log10;
|
401
|
+
#endif
|
402
|
+
}
|
403
|
+
|
404
|
+
else if (strcmp (func_name, "sin") == 0)
|
405
|
+
{
|
406
|
+
*randfun_perf = rand_for_trig_perf;
|
407
|
+
*randfun_soaktest = rand_for_trig_soaktest;
|
408
|
+
*worst_case= 9.24898516520941904595076721307123079895973205566406e-01;
|
409
|
+
*testfun_libm = sin;
|
410
|
+
switch(crlibm_rnd_mode){
|
411
|
+
case RU:
|
412
|
+
*testfun_crlibm = sin_ru; break;
|
413
|
+
case RD:
|
414
|
+
*testfun_crlibm = sin_rd; break;
|
415
|
+
case RZ:
|
416
|
+
*testfun_crlibm = sin_rz; break;
|
417
|
+
default:
|
418
|
+
*testfun_crlibm = sin_rn;
|
419
|
+
}
|
420
|
+
#ifdef HAVE_MATHLIB_H
|
421
|
+
*testfun_libultim = usin;
|
422
|
+
#endif
|
423
|
+
#ifdef HAVE_LIBMCR_H
|
424
|
+
*testfun_libmcr = __libmcr_sin;
|
425
|
+
#endif
|
426
|
+
#ifdef HAVE_MPFR_H
|
427
|
+
*testfun_mpfr = mpfr_sin;
|
428
|
+
#endif
|
429
|
+
}
|
430
|
+
|
431
|
+
else if (strcmp (func_name, "cos") == 0)
|
432
|
+
{
|
433
|
+
*randfun_perf = rand_for_trig_perf;
|
434
|
+
*randfun_soaktest = rand_for_trig_soaktest;
|
435
|
+
*worst_case= 8.87406081479789610177988379291491582989692687988281e-01;
|
436
|
+
*testfun_libm = cos;
|
437
|
+
switch(crlibm_rnd_mode){
|
438
|
+
case RU:
|
439
|
+
*testfun_crlibm = cos_ru; break;
|
440
|
+
case RD:
|
441
|
+
*testfun_crlibm = cos_rd; break;
|
442
|
+
case RZ:
|
443
|
+
*testfun_crlibm = cos_rz; break;
|
444
|
+
default:
|
445
|
+
*testfun_crlibm = cos_rn;
|
446
|
+
}
|
447
|
+
#ifdef HAVE_MATHLIB_H
|
448
|
+
*testfun_libultim = ucos;
|
449
|
+
#endif
|
450
|
+
#ifdef HAVE_LIBMCR_H
|
451
|
+
*testfun_libmcr = __libmcr_cos;
|
452
|
+
#endif
|
453
|
+
#ifdef HAVE_MPFR_H
|
454
|
+
*testfun_mpfr = mpfr_cos;
|
455
|
+
#endif
|
456
|
+
}
|
457
|
+
|
458
|
+
else if (strcmp (func_name, "tan") == 0)
|
459
|
+
{
|
460
|
+
*randfun_perf = rand_for_trig_perf;
|
461
|
+
*randfun_soaktest = rand_for_trig_soaktest;
|
462
|
+
*worst_case= 1.18008664944477814628953638020902872085571289062500e-01;
|
463
|
+
*testfun_libm = tan;
|
464
|
+
switch(crlibm_rnd_mode){
|
465
|
+
case RU:
|
466
|
+
*testfun_crlibm = tan_ru; break;
|
467
|
+
case RD:
|
468
|
+
*testfun_crlibm = tan_rd; break;
|
469
|
+
case RZ:
|
470
|
+
*testfun_crlibm = tan_rz; break;
|
471
|
+
default:
|
472
|
+
*testfun_crlibm = tan_rn;
|
473
|
+
}
|
474
|
+
#ifdef HAVE_MATHLIB_H
|
475
|
+
*testfun_libultim = utan;
|
476
|
+
#endif
|
477
|
+
#ifdef HAVE_LIBMCR_H
|
478
|
+
*testfun_libmcr = __libmcr_tan;
|
479
|
+
#endif
|
480
|
+
#ifdef HAVE_MPFR_H
|
481
|
+
*testfun_mpfr = mpfr_tan;
|
482
|
+
#endif
|
483
|
+
}
|
484
|
+
|
485
|
+
#if 0 /* No cotan in the standard math.h ? */
|
486
|
+
else if (strcmp (func_name, "cotan") == 0)
|
487
|
+
{
|
488
|
+
*randfun_perf = rand_for_trig_perf;
|
489
|
+
*randfun_soaktest = rand_for_trig_soaktest;
|
490
|
+
*worst_case= 1.18008664944477814628953638020902872085571289062500e-01;
|
491
|
+
*testfun_libm = cotan;
|
492
|
+
switch(crlibm_rnd_mode){
|
493
|
+
case RU:
|
494
|
+
*testfun_crlibm = cotan_ru; break;
|
495
|
+
case RD:
|
496
|
+
*testfun_crlibm = cotan_rd; break;
|
497
|
+
case RZ:
|
498
|
+
*testfun_crlibm = cotan_rz; break;
|
499
|
+
default:
|
500
|
+
*testfun_crlibm = cotan_rn;
|
501
|
+
}
|
502
|
+
#ifdef HAVE_MATHLIB_H
|
503
|
+
*testfun_libultim = ucotan;
|
504
|
+
#endif
|
505
|
+
#ifdef HAVE_MPFR_H
|
506
|
+
*testfun_mpfr = mpfr_cotan;
|
507
|
+
#endif
|
508
|
+
}
|
509
|
+
#endif /* no cotan */
|
510
|
+
|
511
|
+
else if (strcmp (func_name, "atan") == 0)
|
512
|
+
{
|
513
|
+
*randfun_perf = rand_for_atan_perf;
|
514
|
+
*randfun_soaktest = rand_for_atan_soaktest;
|
515
|
+
*worst_case= 9.54714164331460501955461950274184346199035644531250e-02;
|
516
|
+
*testfun_libm = atan;
|
517
|
+
switch(crlibm_rnd_mode){
|
518
|
+
case RU:
|
519
|
+
*testfun_crlibm = atan_ru; break;
|
520
|
+
case RD:
|
521
|
+
*testfun_crlibm = atan_rd; break;
|
522
|
+
case RZ:
|
523
|
+
*testfun_crlibm = atan_rz; break;
|
524
|
+
default:
|
525
|
+
*testfun_crlibm = atan_rn ;
|
526
|
+
}
|
527
|
+
#ifdef HAVE_MATHLIB_H
|
528
|
+
*testfun_libultim = uatan;
|
529
|
+
#endif
|
530
|
+
#ifdef HAVE_LIBMCR_H
|
531
|
+
*testfun_libmcr = __libmcr_atan;
|
532
|
+
#endif
|
533
|
+
#ifdef HAVE_MPFR_H
|
534
|
+
*testfun_mpfr = mpfr_atan;
|
535
|
+
#endif
|
536
|
+
}
|
537
|
+
|
538
|
+
|
539
|
+
|
540
|
+
else if (strcmp (func_name, "cosh") == 0)
|
541
|
+
{
|
542
|
+
*randfun_perf = rand_for_csh_perf;
|
543
|
+
*randfun_soaktest = rand_for_csh_soaktest;
|
544
|
+
*worst_case= 3.76323248339103422210882854415103793144226074218750e+00;
|
545
|
+
*testfun_libm = cosh;
|
546
|
+
switch(crlibm_rnd_mode){
|
547
|
+
case RU:
|
548
|
+
*testfun_crlibm = cosh_ru; break;
|
549
|
+
case RD:
|
550
|
+
*testfun_crlibm = cosh_rd; break;
|
551
|
+
case RZ:
|
552
|
+
*testfun_crlibm = cosh_rz; break;
|
553
|
+
default:
|
554
|
+
*testfun_crlibm = cosh_rn;
|
555
|
+
}
|
556
|
+
#ifdef HAVE_MATHLIB_H
|
557
|
+
/* No hyperbolic function in Ziv library */
|
558
|
+
*testfun_libultim = NULL;
|
559
|
+
#endif
|
560
|
+
#ifdef HAVE_MPFR_H
|
561
|
+
*testfun_mpfr = mpfr_cosh;
|
562
|
+
#endif
|
563
|
+
}
|
564
|
+
|
565
|
+
else if (strcmp (func_name, "sinh") == 0)
|
566
|
+
{
|
567
|
+
*randfun_perf = rand_for_csh_perf;
|
568
|
+
*randfun_soaktest = rand_for_csh_soaktest;
|
569
|
+
*worst_case= 5.81191276791475441854117889306508004665374755859375;
|
570
|
+
*testfun_libm = sinh;
|
571
|
+
switch(crlibm_rnd_mode){
|
572
|
+
case RU:
|
573
|
+
*testfun_crlibm = sinh_ru; break;
|
574
|
+
case RD:
|
575
|
+
*testfun_crlibm = sinh_rd; break;
|
576
|
+
case RZ:
|
577
|
+
*testfun_crlibm = sinh_rz; break;
|
578
|
+
default:
|
579
|
+
*testfun_crlibm = sinh_rn;
|
580
|
+
}
|
581
|
+
#ifdef HAVE_MATHLIB_H
|
582
|
+
/* No hyperbolic function in Ziv library */
|
583
|
+
*testfun_libultim = NULL;
|
584
|
+
#endif
|
585
|
+
#ifdef HAVE_MPFR_H
|
586
|
+
*testfun_mpfr = mpfr_sinh;
|
587
|
+
#endif
|
588
|
+
}
|
589
|
+
|
590
|
+
else if (strcmp (func_name, "pow") == 0)
|
591
|
+
{
|
592
|
+
*randfun_perf = rand_for_pow_perf;
|
593
|
+
*randfun_soaktest = rand_for_pow_soaktest;
|
594
|
+
*worst_case= 1;
|
595
|
+
*testfun_libm = pow;
|
596
|
+
switch(crlibm_rnd_mode){
|
597
|
+
case RU:
|
598
|
+
*testfun_crlibm = NULL; break;
|
599
|
+
case RD:
|
600
|
+
*testfun_crlibm = NULL; break;
|
601
|
+
case RZ:
|
602
|
+
*testfun_crlibm = NULL; break;
|
603
|
+
default:
|
604
|
+
/* *testfun_crlibm = pow_rn;*/
|
605
|
+
*testfun_crlibm = NULL;
|
606
|
+
|
607
|
+
}
|
608
|
+
#ifdef HAVE_MATHLIB_H
|
609
|
+
*testfun_libultim = upow;
|
610
|
+
#endif
|
611
|
+
#ifdef HAVE_LIBMCR_H
|
612
|
+
*testfun_libmcr = __libmcr_pow;
|
613
|
+
#endif
|
614
|
+
#ifdef HAVE_MPFR_H
|
615
|
+
*testfun_mpfr = mpfr_pow;
|
616
|
+
#endif
|
617
|
+
}
|
618
|
+
|
619
|
+
|
620
|
+
|
621
|
+
else
|
622
|
+
{
|
623
|
+
fprintf (stderr, "Unknown function: %s\n", func_name);
|
624
|
+
exit (1);
|
625
|
+
}
|
626
|
+
}
|
627
|
+
|
@@ -0,0 +1,28 @@
|
|
1
|
+
extern double zero;
|
2
|
+
|
3
|
+
void test_init(/* pointers to returned value */
|
4
|
+
double (**randfun_perf)(),
|
5
|
+
double (**randfun_soaktest)(),
|
6
|
+
double (**testfun_crlibm)(),
|
7
|
+
int (**testfun_mpfr) (),
|
8
|
+
double (**testfun_libultim) (),
|
9
|
+
double (**testfun_libmcr) (),
|
10
|
+
double (**testfun_libm) (),
|
11
|
+
double* worst_case,
|
12
|
+
/* arguments */
|
13
|
+
char *func_name,
|
14
|
+
char *rnd_mode);
|
15
|
+
/*
|
16
|
+
int rand_int(void);
|
17
|
+
|
18
|
+
double rand_generic(void);
|
19
|
+
|
20
|
+
double rand_double(void);
|
21
|
+
|
22
|
+
double rand_for_exp(void);
|
23
|
+
|
24
|
+
double rand_for_log(void);
|
25
|
+
|
26
|
+
double rand_for_exp_normal(void);
|
27
|
+
|
28
|
+
*/
|