#include "flt_arith.h" struct tests { char *op1, *op2; int oper; char *result; } tests[] = { { "1.0", 0, 0, "1.0000000000000000000" }, { "-1.0", 0, 0, "-1.0000000000000000000" }, { "0.0", 0, 0, "0.0000000000000000000" }, { "1.234567", 0, 0, "1.2345670000000000000" }, { "1.234567", 0, 'D', "1.0000000000000000000" }, { "1.234567", 0, 'R', "2.3456700000000000000e-1" }, { "32768", "32768", '+', "6.5536000000000000000e+4" }, { "32768", "32767", '-', "1.0000000000000000000" }, { "32768", "32768", '*', "1.0737418240000000000e+9" }, { "32768", "32768", '/', "1.0000000000000000000" }, { "1.234567e20", "-1.234567e20", '+', "0.0000000000000000000" }, { 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\n", testno); return 0; }