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,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
|
+
*/
|