David's final changes: more profiler features, fixes.
[ipdf/code.git] / src / tests / stresstest.h
1 #ifndef _REALOPS_H
2 #define _REALOPS_H
3
4 // Test real operations
5
6 #include <cstdlib>
7
8 /**
9  * Test adding and subtracting values in a range
10  * This is an identity; the result should be zero.
11  */ 
12 template <class T>
13 T AddSub(const T & start, const T & end, const T & delta = T(1))
14 {
15         T result = 0;
16         for (T a = start; a < end; a += delta)
17         {
18                 result += a;
19                 for (T b = start; b < end; b += delta)
20                 {
21                         result -= b;
22                 }
23                 for (T b = start; b < end; b += delta)
24                 {
25                         result += b;
26                 }       
27         }
28         for (T a = start; a < end; a += delta)
29         {
30                 result -= a;
31                 for (T b = start; b < end; b += delta)
32                 {
33                         result += b;
34                 }
35                 for (T b = start; b < end; b += delta)
36                 {
37                         result -= b;
38                 }
39         }
40         return result;
41 }
42
43 template <class T>
44 T MulDiv(const T & start, const T & end, const T & delta = T(1))
45 {
46         T result = 1;
47         for (T a = start; a < end; a += delta)
48         {
49                 result *= a;
50                 for (T b = start; b < end; b += delta)
51                 {
52                         result /= b;
53                 }
54                 for (T b = start; b < end; b += delta)
55                 {
56                         result *= b;
57                 }       
58         }
59         for (T a = start; a < end; a += delta)
60         {
61                 result /= a;
62                 for (T b = start; b < end; b += delta)
63                 {
64                         result *= b;
65                 }
66                 for (T b = start; b < end; b += delta)
67                 {
68                         result /= b;
69                 }
70         }
71         return result;
72 }
73
74
75
76 template <class T>
77 void RandomOp(T & a, int recurses=0, const T & max = 1e-6, const T & min = 1e-15)
78 {
79         T b;
80         if (recurses > 0)
81                 b = (min + (rand() % (int64_t)(max)));
82         else
83                 b = RandomOps(recurses-1, max, min);    
84         switch (rand() % 4)
85         {
86                 case 0:
87                         a += b;
88                         break;
89                 case 1:
90                         a -= b;
91                         break;
92                 case 2:
93                         a *= b;
94                         break;
95                 case 3:
96                         a /= b;
97                         break;
98         }
99 }
100
101 /**
102  * Test replying repeated operations randomly
103  */
104 template <class T>
105 T RandomOps(int ops, int recurses=0, const T & min = 1e-15 ,const T & max = 1e-6)
106 {
107         T a = (min + (rand() % (int64_t)(max)));
108         
109
110         
111         for (int i = 0; i < ops; ++i)
112         {
113                 RandomOp(a, recurses, min, max);
114         }
115         return a;
116 }
117
118
119 /**
120  * Test multiplying and dividing values in a range
121  * Such that the result is one
122  */
123 template <class T>
124 T RandomOp(const T & start, const T & end, const T & delta = T(1))
125 {
126         T result = 1;
127         for (T a = start; a < end; a += delta)
128         {
129                 result *= a;
130                 for (T b = start; b < end; b += delta)
131                 {
132                         result /= b;
133                 }
134                 for (T b = start; b < end; b += delta)
135                 {
136                         result *= b;
137                 }       
138         }
139         for (T a = start; a < end; a += a)
140         {
141                 result /= a;
142                 for (T b = start; b < end; b += delta)
143                 {
144                         result *= b;
145                 }
146                 for (T b = start; b < end; b += delta)
147                 {
148                         result /= b;
149                 }
150         }
151         return result;  
152 }
153
154
155 #endif //_REALOPS_H

UCC git Repository :: git.ucc.asn.au