Column Fitting: don't go higher than 15 significant digits by default.
[gnumeric.git] / tools / process-burkardt.c
blobe79951b58e0add1ad07ba3e07fe856330ed6ccd7
2 /*
3 * Include this test values from
4 * http://people.sc.fsu.edu/~jburkardt/c_src/test_values/test_values.c
6 * Omega(0) is overridden to be 0. This is a matter of definition.
7 */
8 #include "test_values.c"
10 #include <string.h>
12 #define FMT "%.17g"
14 static int row;
16 typedef enum {
17 GT_D_D,
18 GT_DD_D,
19 GT_DDD_D,
20 GT_DI_D,
21 GT_I_D,
22 GT_ID_D,
23 GT_IDI_D,
24 GT_IID_D,
25 GT_IIII_D,
26 GT_I_I,
27 GT_II_I,
28 GT_III_I
29 } GenType;
31 static void
32 test_func (const char *func_name,
33 void *generator_,
34 GenType gentype,
35 const char *order)
37 double xd[4], yd;
38 int xi[4], yi;
39 void (*generator)() = generator_;
40 int n_data = 0;
41 int first = 1;
42 int a, n_args;
43 const char *types;
44 int special_args = order && strchr (order, '%') != NULL;
46 while (1) {
47 int r = row + 1;
48 char restype;
50 switch (gentype) {
51 case GT_D_D:
52 generator (&n_data, &xd[0], &yd);
53 types = "D:D";
54 break;
55 case GT_DD_D:
56 generator (&n_data, &xd[0], &xd[1], &yd);
57 types = "DD:D";
58 break;
59 case GT_DDD_D:
60 generator (&n_data, &xd[0], &xd[1], &xd[2], &yd);
61 types = "DDD:D";
62 break;
63 case GT_DI_D:
64 generator (&n_data, &xd[0], &xi[1], &yd);
65 types = "DI:D";
66 break;
67 case GT_I_D:
68 generator (&n_data, &xi[0], &yd);
69 types = "I:D";
70 break;
71 case GT_ID_D:
72 generator (&n_data, &xi[0], &xd[1], &yd);
73 types = "ID:D";
74 break;
75 case GT_IDI_D:
76 generator (&n_data, &xi[0], &xd[1], &xi[2], &yd);
77 types = "IDI:D";
78 break;
79 case GT_IID_D:
80 generator (&n_data, &xi[0], &xi[1], &xd[2], &yd);
81 types = "IID:D";
82 break;
83 case GT_IIII_D:
84 generator (&n_data, &xi[0], &xi[1], &xi[2], &xi[3], &yd);
85 types = "IIII:D";
86 break;
87 case GT_I_I:
88 generator (&n_data, &xi[0], &yi);
89 types = "I:I";
90 break;
91 case GT_II_I:
92 generator (&n_data, &xi[0], &xi[1], &yi);
93 types = "II:I";
94 break;
95 case GT_III_I:
96 generator (&n_data, &xi[0], &xi[1], &xi[2], &yi);
97 types = "III:I";
98 break;
99 default:
100 abort ();
103 if (n_data == 0)
104 break;
106 if (first)
107 printf ("%s,", func_name);
108 else
109 printf ("\"\",");
110 first = 0;
112 printf ("\"=%s(", func_name);
113 n_args = strlen (types) - 2;
114 if (special_args) {
115 char *argstr = strdup (order);
116 const char *pct;
117 while ((pct = strchr (argstr, '%'))) {
118 size_t prelen = pct - argstr;
119 int o = pct[1] - '1';
120 char a1[4 * sizeof (int) + 100];
121 char *newargstr;
123 switch (types[o]) {
124 case 'D':
125 sprintf (a1, FMT, xd[o]);
126 break;
127 case 'I':
128 sprintf (a1, "%d", xi[o]);
129 break;
132 newargstr = malloc (strlen (argstr) + strlen (a1));
133 memcpy (newargstr, argstr, prelen);
134 strcpy (newargstr + prelen, a1);
135 strcat (newargstr + prelen, pct + 2);
136 free (argstr);
137 argstr = newargstr;
139 printf ("%s", argstr);
140 free (argstr);
141 } else {
142 for (a = 0; a < n_args; a++) {
143 int o = order ? order[a] - '1' : a;
144 if (a)
145 printf (",");
146 switch (types[o]) {
147 case 'D':
148 printf (FMT, xd[o]);
149 break;
150 case 'I':
151 printf ("%d", xi[o]);
152 break;
156 printf (")\",");
158 restype = types[n_args + 1];
159 switch (restype) {
160 case 'D':
161 printf (FMT ",", yd);
162 break;
163 case 'I':
164 printf ("%d,", yi);
165 break;
168 switch (restype) {
169 case 'D':
170 printf ("\"=IF(B%d=C%d,\"\"\"\",IF(C%d=0,-LOG10(ABS(B%d)),-LOG10(ABS((B%d-C%d)/C%d))))\"", r, r, r, r, r, r, r);
171 break;
172 case 'I':
173 printf ("\"=IF(B%d=C%d,\"\"\"\",0)\"", r, r);
174 break;
177 printf ("\n");
179 row++;
185 main (int argc, char **argv)
187 row = 0;
188 int do_slow = 0;
190 if (argc >= 2 && strcmp (argv[1], "--slow") == 0)
191 do_slow = 1;
193 printf ("WORST,\"\",\"\",=MIN(D3:D65525)\n");
194 row++;
195 printf ("\"\",\"\",\"\",\"\"\n");
196 row++;
198 test_func ("acos", arccos_values, GT_D_D, NULL);
199 test_func ("acosh", arccosh_values, GT_D_D, NULL);
200 test_func ("agm", agm_values, GT_DD_D, NULL);
201 test_func ("asin", arcsin_values, GT_D_D, NULL);
202 test_func ("asinh", arcsinh_values, GT_D_D, NULL);
203 test_func ("atan", arctan_values, GT_D_D, NULL);
204 test_func ("atan2", arctan2_values, GT_DD_D, NULL);
205 test_func ("atanh", arctanh_values, GT_D_D, NULL);
206 test_func ("besseli", bessel_i0_values, GT_D_D, "%1,0");
207 test_func ("besseli", bessel_i1_values, GT_D_D, "%1,1");
208 test_func ("besseli", bessel_in_values, GT_ID_D, "21");
209 test_func ("besseli", bessel_ix_values, GT_DD_D, "21");
210 test_func ("besselj", bessel_j0_values, GT_D_D, "%1,0");
211 test_func ("besselj", bessel_j1_values, GT_D_D, "%1,1");
212 test_func ("besselj", bessel_jn_values, GT_ID_D, "21");
213 // Our besselj truncates the order.
214 if (0) test_func ("besselj", bessel_jx_values, GT_DD_D, "21");
215 test_func ("besselk", bessel_k0_values, GT_D_D, "%1,0");
216 test_func ("besselk", bessel_k1_values, GT_D_D, "%1,1");
217 test_func ("besselk", bessel_kn_values, GT_ID_D, "21");
218 // Our besselk truncates the order.
219 if (0) test_func ("besselk", bessel_kx_values, GT_DD_D, "21");
220 test_func ("bessely", bessel_y0_values, GT_D_D, "%1,0");
221 test_func ("bessely", bessel_y1_values, GT_D_D, "%1,1");
222 test_func ("bessely", bessel_yn_values, GT_ID_D, "21");
223 // Our bessely truncates the order.
224 if (0) test_func ("bessely", bessel_yx_values, GT_DD_D, "21");
225 test_func ("r.pbeta", beta_cdf_values, GT_DDD_D, "312");
226 test_func ("beta", beta_values, GT_DD_D, NULL);
227 test_func ("combin", binomial_values, GT_II_I, NULL);
228 test_func ("r.pbinom", binomial_cdf_values, GT_IDI_D, "312");
229 test_func ("r.pcauchy", cauchy_cdf_values, GT_DDD_D, "312");
230 test_func ("power", cbrt_values, GT_D_D, "%1,1,3");
231 test_func ("r.pchisq", chi_square_cdf_values, GT_ID_D, "21");
232 test_func ("cos", cos_values, GT_D_D, NULL);
233 test_func ("cosh", cosh_values, GT_D_D, NULL);
234 test_func ("cot", cot_values, GT_D_D, NULL);
235 test_func ("erf", erf_values, GT_D_D, NULL);
236 test_func ("erfc", erfc_values, GT_D_D, NULL);
237 test_func ("exp", exp_values, GT_D_D, NULL);
238 test_func ("r.pexp", exponential_cdf_values, GT_DD_D, "%2,1/%1");
240 test_func ("r.pf", f_cdf_values, GT_IID_D, "312");
241 // f_noncentral_cdf_values ( int *n_data, int *n1, int *n2, double *lambda,
242 test_func ("fact", i4_factorial_values, GT_I_I, NULL);
243 test_func ("fact", r8_factorial_values, GT_I_D, NULL);
244 test_func ("factdouble", i4_factorial2_values, GT_I_I, NULL);
245 // factorial_rising_values ( int *n_data, int *m, int *n, int *fmn )
246 // fresnel_cos_values ( int *n_data, double *x, double *fx )
247 // fresnel_sin_values ( int *n_data, double *x, double *fx )
248 // frobenius_number_data_values ( int *n_data, int order, int c[], int *f )
249 // frobenius_number_order_values ( int *n_data, int *order )
250 // frobenius_number_order2_values ( int *n_data, int *c1, int *c2, int *f )
251 test_func ("gamma", gamma_values, GT_D_D, NULL);
252 test_func ("r.pgamma", gamma_cdf_values, GT_DDD_D, "312");
253 // gamma_inc_p_values ( int *n_data, double *a, double *x, double *fx )
254 // gamma_inc_q_values ( int *n_data, double *a, double *x, double *fx )
255 // gamma_inc_tricomi_values ( int *n_data, double *a, double *x, double *fx )
256 // gamma_inc_values ( int *n_data, double *a, double *x, double *fx )
257 test_func ("gammaln", gamma_log_values, GT_D_D, NULL);
258 // gegenbauer_poly_values ( int *n_data, int *n, double *a, double *x,
259 test_func ("r.pgeom", geometric_cdf_values, GT_ID_D, NULL);
260 // goodwin_values ( int *n_data, double *x, double *fx )
261 test_func ("gd", gud_values, GT_D_D, NULL);
262 // hermite_function_values ( int *n_data, int *n, double *x, double *fx )
263 // hermite_poly_phys_values ( int *n_data, int *n, double *x, double *fx )
264 // hermite_poly_prob_values ( int *n_data, int *n, double *x, double *fx )
265 // hyper_1f1_values ( int *n_data, double *a, double *b, double *x,
266 // hyper_2f1_values ( int *n_data, double *a, double *b, double *c,
267 test_func ("r.phyper", hypergeometric_cdf_values, GT_IIII_D, "%4,%2,%3-%2,%1");
268 test_func ("r.dhyper", hypergeometric_pdf_values, GT_IIII_D, "%4,%2,%3-%2,%1");
269 // hypergeometric_u_values ( int *n_data, double *a, double *b, double *x,
270 // i0ml0_values ( int *n_data, double *x, double *fx )
271 // i1ml1_values ( int *n_data, double *x, double *fx )
272 // void int_values ( int *n_data, double *x, double *fx )
273 // jacobi_cn_values ( int *n_data, double *a, double *x, double *fx )
274 // jacobi_dn_values ( int *n_data, double *a, double *x, double *fx )
275 // jacobi_poly_values ( int *n_data, int *n, double *a, double *b, double *x,
276 // jacobi_sn_values ( int *n_data, double *a, double *x, double *fx )
277 // jed_ce_values ( int *n_data, double *jed, int *y, int *m, int *d,
278 // jed_mjd_values ( int *n_data, double *jed, double *mjd )
279 // jed_rd_values ( int *n_data, double *jed, double *rd )
280 // jed_weekday_values ( int *n_data, double *jed, int *weekday )
281 // kei0_values ( int *n_data, double *x, double *fx )
282 // kei1_values ( int *n_data, double *x, double *fx )
283 // ker0_values ( int *n_data, double *x, double *fx )
284 // ker1_values ( int *n_data, double *x, double *fx )
285 // laguerre_associated_values ( int *n_data, int *n, int *m, double *x,
286 // laguerre_general_values ( int *n_data, int *n, double *a, double *x,
287 // laguerre_polynomial_values ( int *n_data, int *n, double *x, double *fx )
288 // lambert_w_values ( int *n_data, double *x, double *fx )
289 // laplace_cdf_values ( int *n_data, double *mu, double *beta, double *x,
290 // legendre_associated_values ( int *n_data, int *n, int *m, double *x,
291 // legendre_associated_normalized_sphere_values ( int *n_data, int *n, int *m,
292 // legendre_associated_normalized_values ( int *n_data, int *n, int *m,
293 // legendre_function_q_values ( int *n_data, int *n, double *x, double *fx )
294 // legendre_poly_values ( int *n_data, int *n, double *x, double *fx )
295 // lerch_values ( int *n_data, double *z, int *s, double *a, double *fx )
296 // lobachevsky_values ( int *n_data, double *x, double *fx )
297 test_func ("ln", log_values, GT_D_D, NULL);
298 test_func ("r.plnorm", log_normal_cdf_values, GT_DDD_D, "312");
299 // log_series_cdf_values ( int *n_data, double *t, int *n, double *fx )
300 test_func ("log10", log10_values, GT_D_D, NULL);
301 // logarithmic_integral_values ( int *n_data, double *x, double *fx )
302 // logistic_cdf_values ( int *n_data, double *mu, double *beta, double *x,
303 // mertens_values ( int *n_data, int *n, int *c )
304 test_func ("nt_mu", moebius_values, GT_I_I, NULL);
305 test_func ("r.pnbinom", negative_binomial_cdf_values, GT_IID_D, NULL);
306 // nine_j_values ( int *n_data, double *j1, double *j2, double *j3,
307 test_func ("r.pnorm", normal_cdf_values, GT_DDD_D, "312");
308 test_func ("normsdist", normal_01_cdf_values, GT_D_D, NULL);
309 test_func ("nt_omega", omega_values, GT_I_I, NULL);
310 test_func ("owent", owen_values, GT_DD_D, NULL);
311 // partition_count_values ( int *n_data, int *n, int *c )
312 // partition_distinct_count_values ( int *n_data, int *n, int *c )
313 test_func ("nt_phi", phi_values, GT_I_I, NULL);
314 if (do_slow) test_func ("nt_pi", pi_values, GT_I_I, NULL);
315 test_func ("pochhammer", i4_rise_values, GT_II_I, NULL);
316 test_func ("pochhammer", r8_rise_values, GT_DI_D, NULL);
317 test_func ("r.ppois", poisson_cdf_values, GT_DI_D, "21");
318 // polylogarithm_values ( int *n_data, int *n, double *z, double *fx )
319 // prandtl_values ( int *n_data, double *tc, double *p, double *pr )
320 if (do_slow) test_func ("ithprime", prime_values, GT_I_I, NULL);
321 // psat_values ( int *n_data, double *tc, double *p )
322 // psi_values ( int *n_data, double *x, double *fx )
323 // r8_factorial_log_values ( int *n_data, int *n, double *fn )
324 // r8_factorial_values ( int *n_data, int *n, double *fn )
325 // rayleigh_cdf_values ( int *n_data, double *sigma, double *x, double *fx )
326 // secvir_values ( int *n_data, double *tc, double *vir )
327 // shi_values ( int *n_data, double *x, double *fx )
328 // si_values ( int *n_data, double *x, double *fx )
329 test_func ("nt_sigma", sigma_values, GT_I_I, NULL);
330 // sin_power_int_values ( int *n_data, double *a, double *b, int *n,
331 test_func ("sin", sin_values, GT_D_D, NULL);
332 test_func ("sinh", sinh_values, GT_D_D, NULL);
333 // six_j_values ( int *n_data, double *j1, double *j2, double *j3,
334 // sound_values ( int *n_data, double *tc, double *p, double *c )
335 // sphere_unit_area_values ( int *n_data, int *n, double *area )
336 // sphere_unit_volume_values ( int *n_data, int *n, double *volume )
337 // spherical_harmonic_values ( int *n_data, int *l, int *m, double *theta,
338 test_func ("sqrt", sqrt_values, GT_D_D, NULL);
339 // stirling1_values ( int *n_data, int *n, int *m, int *fx )
340 // stirling2_values ( int *n_data, int *n, int *m, int *fx )
341 // stromgen_values ( int *n_data, double *x, double *fx )
342 // struve_h0_values ( int *n_data, double *x, double *fx )
343 // struve_h1_values ( int *n_data, double *x, double *fx )
344 // struve_l0_values ( int *n_data, double *x, double *fx )
345 // struve_l1_values ( int *n_data, double *x, double *fx )
346 test_func ("r.pt", student_cdf_values, GT_DD_D, "21");
347 // student_noncentral_cdf_values ( int *n_data, int *df, double *lambda,
348 // subfactorial_values ( int *n_data, int *n, int *fn )
349 // surten_values ( int *n_data, double *tc, double *sigma )
350 // synch1_values ( int *n_data, double *x, double *fx )
351 // synch2_values ( int *n_data, double *x, double *fx )
352 test_func ("tan", tan_values, GT_D_D, NULL);
353 test_func ("tanh", tanh_values, GT_D_D, NULL);
354 test_func ("nt_d", tau_values, GT_I_I, NULL);
355 // thercon_values ( int *n_data, double *tc, double *p, double *lambda )
356 // three_j_values ( int *n_data, double *j1, double *j2, double *j3,
357 // tran02_values ( int *n_data, double *x, double *fx )
358 // tran03_values ( int *n_data, double *x, double *fx )
359 // tran04_values ( int *n_data, double *x, double *fx )
360 // tran05_values ( int *n_data, double *x, double *fx )
361 // tran06_values ( int *n_data, double *x, double *fx )
362 // tran07_values ( int *n_data, double *x, double *fx )
363 // tran08_values ( int *n_data, double *x, double *fx )
364 // tran09_values ( int *n_data, double *x, double *fx )
365 // trigamma_values ( int *n_data, double *x, double *fx )
366 // tsat_values ( int *n_data, double *p, double *tc )
367 // van_der_corput_values ( int *n_data, int *base, int *seed, double *value )
368 // viscosity_values ( int *n_data, double *tc, double *p, double *eta )
369 // von_mises_cdf_values ( int *n_data, double *a, double *b, double *x,
371 // Differences in year interpretation.
372 if (0) test_func ("weekday", weekday_values, GT_III_I, "date(%1,%2,%3)");
374 test_func ("r.pweibull", weibull_cdf_values, GT_DDD_D, "312");
375 // zeta_values ( int *n_data, int *n, double *zeta )
378 return 0;