* g++.dg/pph/p1mean.cc: Force syntax error.
[official-gcc.git] / gcc / testsuite / g++.dg / pph / p1mean.cc
blobe22349919e977ea6f1f4e0143c7f1b2ea3d0da41
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <math.h>
4 #include <string.h>
6 SYNTAX ERROR TO AVOID COMPILING THIS - IT CAUSES INFINITE RECURSION.
8 static unsigned long long MAX_ITEMS = 10000;
10 static int
11 cmpdouble (const void *p1, const void *p2)
13 double n1 = *((double *)p1);
14 double n2 = *((double *)p2);
16 if (n1 < n2)
17 return -1;
18 else if (n1 > n2)
19 return 1;
20 else
21 return 0;
25 double
26 compute_median (int n, double vec[])
28 qsort (vec, n, sizeof (double), cmpdouble);
30 if (n % 2 == 0)
31 return ((vec[n / 2] + vec[n / 2 - 1]) / 2.0);
32 else
33 return vec[n / 2];
36 double
37 compute_stddev (int n, double avg, double vec[])
39 double sd, sum, s, x;
40 int i;
42 for (x = 0.0, sum = 0.0, i = 0; i < n; i++)
44 double d;
46 x = x + vec[i];
47 d = vec[i] - avg;
48 sum += d * d;
51 s = sum / n;
52 sd = sqrt (s);
54 return sd;
58 int
59 main (int argc, char *argv[])
61 double *vec;
62 double x, sum, product, inverse_sum, arithmetic, geometric, harmonic;
63 double min, max, median, variance, stddev;
64 int count;
65 int ret;
67 sum = 0.0;
68 product = 1.0;
69 inverse_sum = 0.0;
70 count = 0;
71 min = 0.0;
72 max = 0.0;
74 vec = (double *) malloc (MAX_ITEMS * sizeof (double));
76 while (1)
78 ret = scanf ("%lg", &x);
79 if (ret == EOF)
80 break;
82 if (count == 0)
83 min = max = x;
85 if (x < min)
86 min = x;
88 if (x > max)
89 max = x;
91 sum += x;
92 product *= x;
93 inverse_sum += 1.0 / x;
94 vec[count] = x;
96 count++;
97 if (count >= MAX_ITEMS)
99 MAX_ITEMS *= 3;
100 vec = (double *) realloc (vec, MAX_ITEMS * sizeof (double));
104 int do_min = (strstr (argv[0], "min") != NULL);
105 int do_max = (strstr (argv[0], "max") != NULL);
106 int do_avg = (strstr (argv[0], "avg") != NULL);
107 int do_geo = (strstr (argv[0], "geoavg") != NULL);
108 int do_harmonic = (strstr (argv[0], "harmonic") != NULL);
109 int do_median = (strstr (argv[0], "median") != NULL);
110 int do_variance = (strstr (argv[0], "variance") != NULL);
111 int do_stdev = (strstr (argv[0], "stdev") != NULL);
112 int do_all = (argc > 1 && strcmp (argv[1], "-a") == 0);
114 if (count > 0)
116 arithmetic = sum / count;
117 geometric = pow (product, (double) 1.0 / (double) count);
118 harmonic = count / inverse_sum;
119 median = compute_median (count, vec);
120 stddev = compute_stddev (count, arithmetic, vec);
121 variance = stddev * stddev;
123 if (do_all)
125 printf ("# of items read --> %d\n", count);
126 printf ("Min --------------> %lg\n", min);
127 printf ("Max --------------> %lg\n", max);
128 printf ("Arithmetic mean --> %lg\n", arithmetic);
129 printf ("Geometric mean ---> %lg\n", geometric);
130 printf ("Harmonic mean ----> %lg\n", harmonic);
131 printf ("Median -----------> %lg\n", median);
132 printf ("Variance ---------> %lg\n", variance);
133 printf ("Standard dev -----> %lg\n", stddev);
135 else if (do_min)
136 printf ("%lg\n", min);
137 else if (do_max)
138 printf ("%lg\n", max);
139 else if (do_avg)
140 printf ("%lg\n", arithmetic);
141 else if (do_geo)
142 printf ("%lg\n", geometric);
143 else if (do_harmonic)
144 printf ("%lg\n", harmonic);
145 else if (do_median)
146 printf ("%lg\n", median);
147 else if (do_variance)
148 printf ("%lg\n", variance);
149 else if (do_stdev)
150 printf ("%lg\n", stddev);
151 else
153 fprintf (stderr, "ERROR: Unknown value '%s' to compute\n", argv[0]);
154 return 1;
157 else
159 fprintf (stderr, "ERROR: none of the input is positive\n");
160 return 1;
163 return 0;