ack/modules/src/flt_arith/test.c
1991-02-26 15:46:18 +00:00

87 lines
1.6 KiB
C

#include "flt_arith.h"
struct tests {
char *op1, *op2;
int oper;
char *result;
} tests[] = {
{ "1.0", 0, 0, "1.0" },
{ "-1.0", 0, 0, "-1.0" },
{ "0.0", 0, 0, "0.0" },
{ "1.234567", 0, 0, "1.234567" },
{ "1.234567", 0, 'D', "1.0" },
{ "1.234567", 0, 'R', "2.34567e-1" },
{ "32768", "32768", '+', "6.5536e+4" },
{ "32768", "32767", '-', "1.0" },
{ "32768", "32768", '*', "1.073741824e+9" },
{ "32768", "32768", '/', "1.0" },
{ "1.234567e20", "-1.234567e20", '+', "0.0" },
{ "1e100", "1e100", '+', "2.0e+100" },
{ "1e110", "10", '*', "1.0e+111" },
{ "0.5e100", "0.5e100", '*', "2.5e+199" },
{ 0, 0, 0, 0}
};
main()
{
register struct tests *p = tests;
int exit_status = 0;
while (p->op1) {
if (! dotest(p)) exit_status = 1;
p++;
}
exit(exit_status);
}
int
dotest(p)
register struct tests *p;
{
char buf[128];
flt_arith e1, e2, e;
static int testno = 0;
testno++;
flt_str2flt(p->op1, &e1);
switch(p->oper) {
case '+':
flt_str2flt(p->op2, &e2);
flt_add(&e1, &e2, &e);
break;
case '-':
flt_str2flt(p->op2, &e2);
flt_sub(&e1, &e2, &e);
break;
case '*':
flt_str2flt(p->op2, &e2);
flt_mul(&e1, &e2, &e);
break;
case '/':
flt_str2flt(p->op2, &e2);
flt_div(&e1, &e2, &e);
break;
case 'D':
/* integer part of flt_modf */
flt_modf(&e1, &e, &e2);
break;
case 'R':
/* fraction part of flt_modf */
flt_modf(&e1, &e2, &e);
break;
case 'U':
/* unary minus */
e = e1;
flt_umin(&e);
break;
default:
e = e1;
break;
}
flt_flt2str(&e, buf, 128);
if (! strcmp(buf, p->result)) return 1;
printf("Test number %d failed: result = %s, should be %s\n", testno, buf, p->result);
return 0;
}