Pristine Ack-5.5
[Ack-5.5.git] / modules / src / flt_arith / test.c
1 #include "flt_arith.h"
2
3 struct tests {
4         char    *op1, *op2;
5         int     oper;
6         char    *result;
7 } tests[] = {
8         { "1.0", 0, 0, "1.0" },
9         { "-1.0", 0, 0, "-1.0" },
10         { "0.0", 0, 0, "0.0" },
11         { "1.234567", 0, 0, "1.234567" },
12         { "1.234567", 0, 'D', "1.0" },
13         { "1.234567", 0, 'R', "2.34567e-1" },
14         { "32768", "32768", '+', "6.5536e+4" },
15         { "32768", "32767", '-', "1.0" },
16         { "32768", "32768", '*', "1.073741824e+9" },
17         { "32768", "32768", '/', "1.0" },
18         { "1.234567e20", "-1.234567e20", '+', "0.0" },
19         { "1e100", "1e100", '+', "2.0e+100" },
20         { "1e110", "10", '*', "1.0e+111" },
21         { "0.5e100", "0.5e100", '*', "2.5e+199" },
22         { 0, 0, 0, 0}
23 };
24
25 main()
26 {
27         register struct tests *p = tests;
28         int exit_status = 0;
29
30         while (p->op1) {
31                 if (! dotest(p)) exit_status = 1;
32                 p++;
33         }
34         exit(exit_status);
35 }
36
37 int
38 dotest(p)
39         register struct tests *p;
40 {
41         char buf[128];
42         flt_arith e1, e2, e;
43         static int testno = 0;
44
45         testno++;
46         flt_str2flt(p->op1, &e1);
47         switch(p->oper) {
48         case '+':
49                 flt_str2flt(p->op2, &e2);
50                 flt_add(&e1, &e2, &e);
51                 break;
52         case '-':
53                 flt_str2flt(p->op2, &e2);
54                 flt_sub(&e1, &e2, &e);
55                 break;
56         case '*':
57                 flt_str2flt(p->op2, &e2);
58                 flt_mul(&e1, &e2, &e);
59                 break;
60         case '/':
61                 flt_str2flt(p->op2, &e2);
62                 flt_div(&e1, &e2, &e);
63                 break;
64         case 'D':
65                 /* integer part of flt_modf */
66                 flt_modf(&e1, &e, &e2);
67                 break;
68         case 'R':
69                 /* fraction part of flt_modf */
70                 flt_modf(&e1, &e2, &e);
71                 break;
72         case 'U':
73                 /* unary minus */
74                 e = e1;
75                 flt_umin(&e);
76                 break;
77         default:
78                 e = e1;
79                 break;
80         }
81         flt_flt2str(&e, buf, 128);
82
83         if (! strcmp(buf, p->result)) return 1;
84
85         printf("Test number %d failed: result = %s, should be %s\n", testno, buf, p->result);
86         return 0;
87 }