Annotation of OpenXM_contrib/PHC/Ada/Math_Lib/Numbers/ts_cmpnum.adb, Revision 1.1.1.1
1.1 maekawa 1: with text_io,integer_io; use text_io,integer_io;
2: with Standard_Complex_Numbers; use Standard_Complex_Numbers;
3: with Standard_Complex_Numbers_io; use Standard_Complex_Numbers_io;
4: with Standard_Complex_Numbers_Polar; use Standard_Complex_Numbers_Polar;
5: with Multprec_Floating_Numbers; use Multprec_Floating_Numbers;
6: with Multprec_Floating_Numbers_io; use Multprec_Floating_Numbers_io;
7: with Multprec_Complex_Numbers; use Multprec_Complex_Numbers;
8: with Multprec_Complex_Numbers_io; use Multprec_Complex_Numbers_io;
9: with Standard_Random_Numbers; use Standard_Random_Numbers;
10: with Multprec_Random_Numbers; use Multprec_Random_Numbers;
11:
12: procedure ts_cmpnum is
13:
14: -- DESCRIPTION :
15: -- Interactive/Random testing on standard/multi-precision complex arithmetic.
16:
17: procedure Test_Standard_io is
18:
19: c : Standard_Complex_Numbers.Complex_Number;
20: use Standard_Complex_Numbers;
21:
22: begin
23: new_line;
24: put_line("Testing input/output for standard complex numbers.");
25: new_line;
26: put("Give a complex number c : "); get(c);
27: put("-> c : "); put(c); new_line;
28: put("-> 1/c : "); put(1.0/c); new_line;
29: put("-> 1/c : "); put(Create(1.0)/c); new_line;
30: end Test_Standard_io;
31:
32: procedure Test_Multprec_io is
33:
34: c : Multprec_Complex_Numbers.Complex_Number;
35:
36: begin
37: new_line;
38: put_line("Testing input/output for multi-precision complex numbers.");
39: new_line;
40: put("Give a complex number c : "); get(c);
41: put("-> c : "); put(c); new_line;
42: end Test_Multprec_io;
43:
44: procedure Test_Roots is
45:
46: d,k : natural;
47: a,c,prod : Standard_Complex_Numbers.Complex_Number;
48: ans : character;
49:
50: begin
51: new_line;
52: put_line("Solving x^d - c = 0, with c a standard complex number.");
53: new_line;
54: put("Give the degree d : "); get(d);
55: put("Give the constant c : "); get(c);
56: loop
57: put("Which root do you want ? "); get(k);
58: a := Root(c,d,k);
59: put("The root is "); put(a); new_line;
60: prod := a;
61: for j in 2..d loop
62: prod := prod*a;
63: end loop;
64: put("root^d = "); put(prod); new_line;
65: if Equal(prod,c)
66: then put_line("root^d = c, test is successful.");
67: else put_line("root^d /= c, bug detected? ");
68: put("Difference : "); put(prod-c); new_line;
69: end if;
70: put("Do you want other roots ? (y/n) "); get(ans);
71: exit when ans /= 'y';
72: end loop;
73: end Test_Roots;
74:
75: function Random ( sz : natural; low,upp : integer ) return Floating_Number is
76:
77: -- DESCRIPTION :
78: -- Generates a random number of the given size, with exponent between
79: -- the bounds low and upp.
80:
81: res : Floating_Number := Random(sz);
82: exp : integer := Random(low,upp);
83:
84: begin
85: if exp > 0
86: then for i in 1..exp loop
87: Mul(res,10.0);
88: end loop;
89: elsif exp < 0
90: then for i in 1..(-exp) loop
91: Div(res,10.0);
92: end loop;
93: end if;
94: return res;
95: end Random;
96:
97: function Random ( sz : natural; low,upp : integer )
98: return Multprec_Complex_Numbers.Complex_Number is
99:
100: -- DESCRIPTION :
101: -- Generates a random number of the given size, with exponents for real
102: -- and imaginary parts between low and upp.
103:
104: begin
105: return Create(Random(sz,low,upp),Random(sz,low,upp));
106: end Random;
107:
108: procedure Standard_Random_Addition_and_Subtraction is
109:
110: -- DESCRIPTION :
111: -- Three tests are performed:
112: -- 1) n1+n2-n2 = n1, with "+" and "-".
113: -- 2) Add(n1,n2) is the same as n1 := n1+n2?
114: -- 3) Sub(n1+n2,n1) leads to n2?
115:
116: n1,n2,sum1,sum2 : Standard_Complex_Numbers.Complex_Number;
117:
118: procedure Report_Bug is
119: begin
120: new_line;
121: put(" n1 : "); put(n1); new_line;
122: put(" n2 : "); put(n2); new_line;
123: end Report_Bug;
124:
125: begin
126: n1 := Random;
127: n2 := Random;
128: sum1 := n1+n2;
129: sum2 := sum1-n2;
130: if Equal(sum2,n1)
131: then put("n1+n2-n2 okay");
132: else put("n1+n2-n2 Bug?"); Report_Bug;
133: put("diff : "); put(sum2-n1); new_line;
134: end if;
135: Add(sum2,n2);
136: if Equal(sum2,sum1)
137: then put(" Add okay");
138: else put(" Add Bug?"); Report_Bug;
139: put("diff : "); put(sum2-sum1); new_line;
140: end if;
141: Sub(sum2,n1);
142: if Equal(sum2,n2)
143: then put(" Sub okay"); new_line;
144: else put(" Sub Bug?"); Report_Bug;
145: put("diff : "); put(sum2-n2); new_line;
146: end if;
147: exception
148: when CONSTRAINT_ERROR => put_line("input caused exception:");
149: Report_Bug; raise;
150: end Standard_Random_Addition_and_Subtraction;
151:
152: procedure Standard_Additions_and_Subtractions_on_Randoms is
153:
154: -- DESCRIPTION :
155: -- Generates a number of random floats and performs repeated
156: -- additions and subtractions with checks on consistencies.
157:
158: nb : natural;
159:
160: begin
161: put("Give the number of tests : "); get(nb);
162: for i in 1..nb loop
163: Standard_Random_Addition_and_Subtraction;
164: end loop;
165: end Standard_Additions_and_Subtractions_on_Randoms;
166:
167: procedure Multprec_Random_Addition_and_Subtraction
168: ( sz1,sz2 : in natural; low,upp : in integer ) is
169:
170: -- DESCRIPTION :
171: -- Three tests are performed:
172: -- 1) n1+n2-n2 = n1, with "+" and "-".
173: -- 2) Add(n1,n2) is the same as n1 := n1+n2?
174: -- 3) Sub(n1+n2,n1) leads to n2?
175:
176: n1,n2,sum1,sum2 : Multprec_Complex_Numbers.Complex_Number;
177:
178: procedure Report_Bug is
179: begin
180: new_line;
181: put(" n1 : "); put(n1); new_line;
182: put(" n2 : "); put(n2); new_line;
183: end Report_Bug;
184:
185: begin
186: n1 := Random(sz1,low,upp);
187: n2 := Random(sz2,low,upp);
188: sum1 := n1+n2;
189: sum2 := sum1-n2;
190: if Equal(sum2,n1)
191: then put("n1+n2-n2 okay");
192: else put("n1+n2-n2 Bug?"); Report_Bug;
193: put("diff : "); put(sum2-n1); new_line;
194: end if;
195: Add(sum2,n2);
196: if Equal(sum2,sum1)
197: then put(" Add okay");
198: else put(" Add Bug?"); Report_Bug;
199: put("diff : "); put(sum2-sum1); new_line;
200: end if;
201: Sub(sum2,n1);
202: if Equal(sum2,n2)
203: then put(" Sub okay"); new_line;
204: else put(" Sub Bug?"); Report_Bug;
205: put("diff : "); put(sum2-n2); new_line;
206: end if;
207: Clear(n1); Clear(n2);
208: Clear(sum1); Clear(sum2);
209: exception
210: when CONSTRAINT_ERROR => put_line("input caused exception:");
211: Report_Bug; raise;
212: end Multprec_Random_Addition_and_Subtraction;
213:
214: procedure Multprec_Additions_and_Subtractions_on_Randoms is
215:
216: -- DESCRIPTION :
217: -- Generates a number of random floats and performs repeated
218: -- additions and subtractions with checks on consistencies.
219:
220: nb,sz1,sz2 : natural;
221: low,upp : integer;
222:
223: begin
224: put("Give the number of tests : "); get(nb);
225: put("Give the size of the 1st number : "); get(sz1);
226: put("Give the size of the 2nd number : "); get(sz2);
227: put("Give lower bound on exponent : "); get(low);
228: put("Give upper bound on exponent : "); get(upp);
229: for i in 1..nb loop
230: Multprec_Random_Addition_and_Subtraction(sz1,sz2,low,upp);
231: end loop;
232: end Multprec_Additions_and_Subtractions_on_Randoms;
233:
234: procedure Interactive_Multiplication_and_Division is
235:
236: n1,n2,prod,quot : Multprec_Complex_Numbers.Complex_Number;
237: ans : character;
238:
239: begin
240: loop
241: put("Give 1st number : "); get(n1);
242: put("-> n1 : "); put(n1); new_line;
243: put("Give 2nd number : "); get(n2);
244: put("-> n2 : "); put(n2); new_line;
245: prod := n1*n2;
246: put("n1*n2 : "); put(prod); new_line;
247: quot := prod/n2;
248: put("(n1*n2)/n2 : "); put(quot); new_line;
249: Clear(n1); Clear(n2); Clear(prod); Clear(quot);
250: put("Do you want more tests ? (y/n) "); get(ans);
251: exit when (ans /= 'y');
252: end loop;
253: end Interactive_Multiplication_and_Division;
254:
255: procedure Random_Multiplication_and_Division
256: ( sz1,sz2 : in natural; low,upp : in integer ) is
257:
258: -- DESCRIPTION :
259: -- Three tests are performed :
260: -- 1) n1*n2/n2 = n1, with "*" and "/".
261: -- 2) Mul(n1,n2) is the same as n1 := n1*n2 ?
262: -- 3) Div(n1*n2,n1) leads to n2 ?
263:
264: n1,n2,prod,quot : Multprec_Complex_Numbers.Complex_Number;
265:
266: procedure Report_Bug is
267: begin
268: new_line;
269: put(" n1 : "); put(n1); new_line;
270: put(" n2 : "); put(n2); new_line;
271: end Report_Bug;
272:
273: begin
274: n1 := Random(sz1,low,upp);
275: n2 := Random(sz2,low,upp);
276: prod := n1*n2;
277: quot := prod/n2;
278: if Equal(quot,n1)
279: then put("n1*n2/n2 okay");
280: else put("n1*n2/n2 Bug?"); Report_Bug;
281: put("Diff : "); put(quot-n1); new_line;
282: end if;
283: Mul(quot,n2);
284: if Equal(prod,quot)
285: then put(" Mul okay");
286: else put(" Mul Bug?"); Report_Bug;
287: put("Diff : "); put(quot-prod); new_line;
288: end if;
289: Div(prod,n1);
290: if Equal(prod,n2)
291: then put(" Div okay"); new_line;
292: else put(" Div Bug?"); Report_Bug;
293: put("Diff : "); put(prod-n2); new_line;
294: end if;
295: Clear(n1); Clear(n2);
296: Clear(prod); Clear(quot);
297: exception
298: when CONSTRAINT_ERROR => put_line("input caused exception :");
299: Report_Bug; raise;
300: end Random_Multiplication_and_Division;
301:
302: procedure Multiplications_and_Divisions_on_Randoms is
303:
304: -- DESCRIPTION :
305: -- Generates a number of random floats and performs repeated
306: -- multiplications and divisions with checks on consistencies.
307:
308: nb,sz1,sz2 : natural;
309: low,upp : integer;
310:
311: begin
312: put("Give the number of tests : "); get(nb);
313: put("Give the size of the 1st number : "); get(sz1);
314: put("Give the size of the 2nd number : "); get(sz2);
315: put("Give lower bound on exponent : "); get(low);
316: put("Give upper bound on exponent : "); get(upp);
317: for i in 1..nb loop
318: Random_Multiplication_and_Division(sz1,sz2,low,upp);
319: end loop;
320: end Multiplications_and_Divisions_on_Randoms;
321:
322: procedure Main is
323:
324: ans : character;
325:
326: begin
327: new_line;
328: put_line("Interactive testing of standard and multi-precision "
329: & "complex numbers.");
330: loop
331: new_line;
332: put_line("Choose one of the following : ");
333: put_line(" 0. Exit this program. ");
334: put_line(" 1. Input/Output of standard complex numbers. ");
335: put_line(" 2. Addition/subtraction on random standard numbers. ");
336: put_line(" 3. Compute roots of unity of standard complex numbers. ");
337: put_line(" 4. Input/Output of multi-precision complex numbers. ");
338: put_line(" 5. Addition/subtraction on random multi-precision numbers.");
339: put_line(" 6. Multiplication/division/remainder on random "
340: & "multi-precision numbers. ");
341: put_line(" 7. Multiplication/division on user-given numbers. ");
342: put("Type in your choice (0,1,2,3,4,5,6, or 7) : "); get(ans);
343: exit when (ans = '0');
344: new_line;
345: case ans is
346: when '1' => Test_Standard_io;
347: when '2' => Standard_Additions_and_Subtractions_on_Randoms;
348: when '3' => Test_Roots;
349: when '4' => Test_Multprec_io;
350: when '5' => Multprec_Additions_and_Subtractions_on_Randoms;
351: when '6' => Multiplications_and_Divisions_on_Randoms;
352: when '7' => Interactive_Multiplication_and_Division;
353: when others => null;
354: end case;
355: end loop;
356: end Main;
357:
358: begin
359: Main;
360: end ts_cmpnum;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>