ulps: Fix long lines
[mathlib.git] / etc / testrand.c
1 #define _XOPEN_SOURCE 600
2
3 #include <float.h>
4 #include <math.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <string.h>
8 #include <unistd.h>
9
10 #include "subr_random.h"
11
12 static void usage(const char *progname);
13
14 int
15 main(int argc, char *argv[])
16 {
17         const char *progname, *type;
18         int i, min = -1, max = -1, total = -1;
19         int opt;
20         float fx, flower, fupper;
21         double dx, dlower, dupper;
22         long double ldx, ldlower, ldupper;
23
24         /* Save program name for later use */
25         progname = argv[0];
26         type = argv[1];
27
28         optind++;
29
30         /* Parse arguments. */
31         while ((opt = getopt(argc, argv, "m:M:t:")) != -1) {
32                 switch (opt) {
33                 case 'm':
34                         min = atoi(optarg);
35                         break;
36                 case 'M':
37                         max = atoi(optarg);
38                         break;
39                 case 't':
40                         total = atoi(optarg);
41                         break;
42                 default:
43                         usage(progname);
44                         /* NEVER REACHED */
45                 }
46         }
47
48         /* optind is the argv[] index of the first non-option element */
49         if (optind < argc) {
50                 fprintf(stderr, "non-option argv[]-elements: ");
51                 while (optind < argc)
52                         fprintf(stderr, "%s ", argv[optind++]);
53                 fprintf(stderr, "\n");
54                 exit(EXIT_FAILURE);
55         }
56
57         /* Make sure all arguments were supplied, plus validate input */
58         if (total == -1 || min == -1 || max == -1 || min > max) {
59                 usage(progname);
60                 /* NEVER REACHED */
61         }
62
63         if (strcmp(type, "float") && strcmp(type, "double")
64             && (strcmp(type, "ldouble"))) {
65                 usage(progname);
66                 /* NEVER REACHED */
67         }
68
69         /* Initialize random number generator */
70         init_randgen();
71
72         /* Ready to go */
73         if (!strcmp(type, "float")) {
74                 if (min == 0 && max == 0) {
75                         flower = -FLT_MAX;
76                         fupper =  FLT_MAX;
77                 }
78
79                 for (i = 0; i < total; i++) {
80                         do {
81                                 fx = random_float(FP_NORMAL);
82                         } while (fx < flower || fx > fupper);
83                         printf("% .8e\n", fx);
84                 }
85         }
86
87         if (!strcmp(type, "double")) {
88                 if (min == 0 && max == 0) {
89                         dlower = -DBL_MAX;
90                         dupper =  DBL_MAX;
91                 }
92
93                 for (i = 0; i < total; i++) {
94                         do {
95                                 dx = random_double(FP_NORMAL);
96                         } while(dx < dlower || dx > dupper);
97                         printf("% .16e\n", dx);
98                 }
99         }
100
101         /* XXX: How many significand bits to write ? */
102         if (!strcmp(type, "ldouble")) {
103                 if (min == 0 && max == 0) {
104                         ldlower = -LDBL_MAX;
105                         ldupper =  LDBL_MAX;
106                 }
107                 for (i = 0; i < total; i++) {
108                         do {
109                                 ldx = random_long_double(FP_NORMAL);
110                         } while(ldx < ldlower || ldx > ldupper);
111                         printf("% .32Le\n", ldx);
112                 }
113         }
114
115         return (EXIT_SUCCESS);
116 }
117
118 static void
119 usage(const char *progname)
120 {
121         fprintf(stderr,
122             "usage: %s {float, double, ldouble} -t total -m min -M max\n",
123             progname);
124         fprintf(stderr,
125             "\tIf min == max, then all possible range is assumed,\n"
126             "\te.g. [-DBL_MAX, DBL_MAX]\n");
127         exit(EXIT_FAILURE);
128 }