From: ceriel Date: Mon, 16 Oct 1989 17:56:36 +0000 (+0000) Subject: simplified a bit X-Git-Tag: release-5-5~2206 X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=82c3158adaf425bc0a5ae3a27cf725e1ebf6775c;p=ack.git simplified a bit --- diff --git a/modules/src/flt_arith/Makefile b/modules/src/flt_arith/Makefile index 8a8eeb288..b49f02a4b 100644 --- a/modules/src/flt_arith/Makefile +++ b/modules/src/flt_arith/Makefile @@ -13,11 +13,11 @@ LIBFLT = libflt.$(LIBSUF) SRC = b64_add.c flt_ar2flt.c flt_div.c flt_nrm.c b64_sft.c flt_chk.c \ flt_flt2ar.c flt_str2fl.c flt_add.c flt_cmp.c flt_mul.c ucmp.c \ - flt_modf.c flt_umin.c + flt_modf.c flt_umin.c split.c OBJ = b64_add.$(SUF) flt_ar2flt.$(SUF) flt_div.$(SUF) flt_nrm.$(SUF) \ b64_sft.$(SUF) flt_chk.$(SUF) flt_flt2ar.$(SUF) flt_str2fl.$(SUF) \ flt_add.$(SUF) flt_cmp.$(SUF) flt_mul.$(SUF) ucmp.$(SUF) \ - flt_modf.$(SUF) flt_umin.$(SUF) + flt_modf.$(SUF) flt_umin.$(SUF) split.$(SUF) .SUFFIXES: .$(SUF) .c.$(SUF): @@ -67,3 +67,4 @@ flt_mul.$(SUF): misc.h flt_arith.h flt_modf.$(SUF): misc.h flt_arith.h flt_umin.$(SUF): misc.h ucmp.$(SUF): misc.h flt_arith.h +split.$(SUF): misc.h flt_arith.h diff --git a/modules/src/flt_arith/b64_sft.c b/modules/src/flt_arith/b64_sft.c index 60d39d0aa..dcfee1f3d 100644 --- a/modules/src/flt_arith/b64_sft.c +++ b/modules/src/flt_arith/b64_sft.c @@ -11,65 +11,37 @@ flt_b64_sft(e,n) register struct flt_mantissa *e; register int n; { + if (n > 63 || n < -63) { + e->flt_l_32 = 0; + e->flt_h_32 = 0; + return; + } + if (n >= 32) { + e->flt_l_32 = e->flt_h_32; + e->flt_h_32 = 0; + n -= 32; + } if (n > 0) { - if (n > 63) { - e->flt_l_32 = 0; - e->flt_h_32 = 0; - return; - } - if (n >= 32) { - e->flt_l_32 = e->flt_h_32; - e->flt_h_32 = 0; - n -= 32; - } - if (n > 0) { - e->flt_l_32 = (e->flt_l_32 >> 1) & 0x7FFFFFFF; - e->flt_l_32 >>= (n - 1); - if (e->flt_h_32 != 0) { - e->flt_l_32 |= (e->flt_h_32 << (32 - n)) & 0xFFFFFFFF; - e->flt_h_32 = (e->flt_h_32 >> 1) & 0x7FFFFFFF; - e->flt_h_32 >>= (n - 1); - } + e->flt_l_32 = (e->flt_l_32 >> 1) & 0x7FFFFFFF; + e->flt_l_32 >>= (n - 1); + if (e->flt_h_32 != 0) { + e->flt_l_32 |= (e->flt_h_32 << (32 - n)) & 0xFFFFFFFF; + e->flt_h_32 = (e->flt_h_32 >> 1) & 0x7FFFFFFF; + e->flt_h_32 >>= (n - 1); } - return; } n = -n; + if (n >= 32) { + e->flt_h_32 = e->flt_l_32; + e->flt_l_32 = 0; + n -= 32; + } if (n > 0) { - if (n > 63) { - e->flt_l_32 = 0; - e->flt_h_32 = 0; - return; - } - if (n >= 32) { - e->flt_h_32 = e->flt_l_32; - e->flt_l_32 = 0; - n -= 32; - } - if (n > 0) { - e->flt_h_32 = (e->flt_h_32 << n) & 0xFFFFFFFF; - if (e->flt_l_32 != 0) { - long l = (e->flt_l_32 >> 1) & 0x7FFFFFFF; - e->flt_h_32 |= (l >> (31 - n)); - e->flt_l_32 = (e->flt_l_32 << n) & 0xFFFFFFFF; - } + e->flt_h_32 = (e->flt_h_32 << n) & 0xFFFFFFFF; + if (e->flt_l_32 != 0) { + long l = (e->flt_l_32 >> 1) & 0x7FFFFFFF; + e->flt_h_32 |= (l >> (31 - n)); + e->flt_l_32 = (e->flt_l_32 << n) & 0xFFFFFFFF; } } } - -flt_b64_lsft(e) - register struct flt_mantissa *e; -{ - /* shift left 1 bit */ - e->flt_h_32 = (e->flt_h_32 << 1) & 0xFFFFFFFF; - if (e->flt_l_32 & 0x80000000L) e->flt_h_32 |= 1; - e->flt_l_32 = (e->flt_l_32 << 1) & 0xFFFFFFFF; -} - -flt_b64_rsft(e) - register struct flt_mantissa *e; -{ - /* shift right 1 bit */ - e->flt_l_32 = (e->flt_l_32 >> 1) & 0x7FFFFFFF; - if (e->flt_h_32 & 1) e->flt_l_32 |= 0x80000000L; - e->flt_h_32 = (e->flt_h_32 >> 1) & 0x7FFFFFFF; -} diff --git a/modules/src/flt_arith/flt_add.c b/modules/src/flt_arith/flt_add.c index 6dfd77a45..196d34c77 100644 --- a/modules/src/flt_arith/flt_add.c +++ b/modules/src/flt_arith/flt_add.c @@ -65,7 +65,7 @@ flt_add(e1,e2,e3) else { *e3 = *e2; if (flt_b64_add(&e3->flt_mantissa,&e1->flt_mantissa)) {/* addition carry */ - flt_b64_rsft(&e3->flt_mantissa); + flt_b64_sft(&e3->flt_mantissa, 1); e3->m1 |= 0x80000000L; /* set max bit */ e3->flt_exp++; /* increase the exponent */ } diff --git a/modules/src/flt_arith/flt_ar2flt.c b/modules/src/flt_arith/flt_ar2flt.c index 379a517bf..2582a4b7a 100644 --- a/modules/src/flt_arith/flt_ar2flt.c +++ b/modules/src/flt_arith/flt_ar2flt.c @@ -35,7 +35,7 @@ flt_arith2flt(n, e) e->flt_exp++; } for (i = 64; i > 0 && n != 0; i--) { - flt_b64_rsft(&(e->flt_mantissa)); + flt_b64_sft(&(e->flt_mantissa),1); e->m1 |= (n & 1) << 31; n >>= 1; } diff --git a/modules/src/flt_arith/flt_div.c b/modules/src/flt_arith/flt_div.c index 39134bea4..35e3105a8 100644 --- a/modules/src/flt_arith/flt_div.c +++ b/modules/src/flt_arith/flt_div.c @@ -35,16 +35,10 @@ flt_div(e1,e2,e3) e3->flt_exp = e1->flt_exp - e2->flt_exp; u[4] = (e1->m2 & 1) << 15; - flt_b64_rsft(&(e1->flt_mantissa)); - u[0] = (e1->m1 >> 16) & 0xFFFF; - u[1] = e1->m1 & 0xFFFF; - u[2] = (e1->m2 >> 16) & 0xFFFF; - u[3] = e1->m2 & 0xFFFF; + flt_b64_sft(&(e1->flt_mantissa),1); + flt_split(e1, u); u[5] = 0; u[6] = 0; u[7] = 0; - v[1] = (e2->m1 >> 16) & 0xFFFF; - v[2] = e2->m1 & 0xFFFF; - v[3] = (e2->m2 >> 16) & 0xFFFF; - v[4] = e2->m2 & 0xFFFF; + flt_split(e2, &v[1]); while (! v[maxv]) maxv--; result[0] = 0; result[1] = 0; @@ -68,20 +62,20 @@ flt_div(e1,e2,e3) q_est = temp; } else if (temp >= 0) { - q_est = temp / v[1]; + q_est = temp / (long)v[1]; } else { long rem; - q_est = (0x7FFFFFFF/v[1])+((temp&0x7FFFFFFF)/v[1]); - rem = (0x7FFFFFFF%v[1])+((temp&0x7FFFFFFF)%v[1])+1; - while (rem > v[1]) { + q_est = (0x7FFFFFFF/(long)v[1])+((temp&0x7FFFFFFF)/(long)v[1]); + rem = (0x7FFFFFFF%(long)v[1])+((temp&0x7FFFFFFF)%(long)v[1])+1; + while (rem > (long)v[1]) { q_est++; rem -= v[1]; } } - temp -= q_est * v[1]; + temp -= q_est * (long)v[1]; while (!(temp&0xFFFF0000) && - ucmp((long)(v[2]*q_est),(long)((temp<<16)+u_p[2])) > 0) { + ucmp((long)v[2]*q_est,(temp<<16)+(long)u_p[2]) > 0) { q_est--; temp += v[1]; } @@ -95,7 +89,7 @@ flt_div(e1,e2,e3) int borrow = 0; for (i = maxv; i > 0; i--) { - long tmp = q_est * v[i] + k + borrow; + long tmp = q_est * (long)v[i] + k + borrow; unsigned short md = tmp & 0xFFFF; borrow = (md > u_p[i]); diff --git a/modules/src/flt_arith/flt_mul.c b/modules/src/flt_arith/flt_mul.c index f3ecb348e..dd98d0907 100644 --- a/modules/src/flt_arith/flt_mul.c +++ b/modules/src/flt_arith/flt_mul.c @@ -32,14 +32,8 @@ flt_mul(e1,e2,e3) /* assign unknown long formats */ /* to known unsigned word formats */ - mp[0] = (e1->m1 >> 16) & 0xFFFF; - mp[1] = e1->m1 & 0xFFFF; - mp[2] = (e1->m2 >> 16) & 0xFFFF; - mp[3] = e1->m2 & 0xFFFF; - mc[0] = (e2->m1 >> 16) & 0xFFFF; - mc[1] = e2->m1 & 0xFFFF; - mc[2] = (e2->m2 >> 16) & 0xFFFF; - mc[3] = e2->m2 & 0xFFFF; + flt_split(e1, mp); + flt_split(e2, mc); for (i = 8; i--;) { result[i] = 0; } diff --git a/modules/src/flt_arith/flt_str2fl.c b/modules/src/flt_arith/flt_str2fl.c index 9a3b20e25..e3d1fcd24 100644 --- a/modules/src/flt_arith/flt_str2fl.c +++ b/modules/src/flt_arith/flt_str2fl.c @@ -204,26 +204,14 @@ add_exponent(e, exp) if (neg) exp = -exp; divsz = exp / SMALLSZ; modsz = exp % SMALLSZ; - if (neg) { - flt_mul(e, &r_10pow[modsz], &x); - while (divsz >= BIGSZ) { - flt_mul(&x, &r_big_10pow[BIGSZ-1],&x); - divsz -= BIGSZ-1; - flt_chk(e); - if (flt_status != 0) return; - } - flt_mul(&x, &r_big_10pow[divsz], e); - } - else { - flt_mul(e, &s10pow[modsz], &x); - while (divsz >= BIGSZ) { - flt_mul(&x, &big_10pow[BIGSZ-1],&x); - divsz -= BIGSZ-1; - flt_chk(e); - if (flt_status != 0) return; - } - flt_mul(&x, &big_10pow[divsz], e); + flt_mul(e, (neg ? r_10pow : s10pow) + modsz, &x); + while (divsz >= BIGSZ) { + flt_mul(&x, neg ? &r_big_10pow[BIGSZ-1] : &big_10pow[BIGSZ-1],&x); + divsz -= BIGSZ-1; + flt_chk(e); + if (flt_status != 0) return; } + flt_mul(&x, (neg ? r_big_10pow : big_10pow) + divsz, e); } flt_str2flt(s, e) @@ -258,7 +246,7 @@ flt_str2flt(s, e) a1 = e->flt_mantissa; flt_b64_sft(&(e->flt_mantissa), -3); - flt_b64_lsft(&a1); + flt_b64_sft(&a1, -1); flt_b64_add(&(e->flt_mantissa), &a1); a1.flt_h_32 = 0; a1.flt_l_32 = c - '0'; diff --git a/modules/src/flt_arith/misc.h b/modules/src/flt_arith/misc.h index cc35e254a..254d3134e 100644 --- a/modules/src/flt_arith/misc.h +++ b/modules/src/flt_arith/misc.h @@ -19,3 +19,4 @@ #define flt_nrm flt__nrm #define flt_chk flt__chk #define flt_b64_add flt__64add +#define flt_split flt__split diff --git a/modules/src/flt_arith/split.c b/modules/src/flt_arith/split.c new file mode 100644 index 000000000..653c3df48 --- /dev/null +++ b/modules/src/flt_arith/split.c @@ -0,0 +1,16 @@ +/* $Header$ */ + +#include "misc.h" + +flt_split(e, p) + register flt_arith *e; + register unsigned short *p; +{ + /* Split mantissa of e into the array p + */ + + p[0] = (int)(e->m1 >> 16) & 0xFFFF; + p[1] = (int)(e->m1) & 0xFFFF; + p[2] = (int)(e->m2 >> 16) & 0xFFFF; + p[3] = (int)(e->m2) & 0xFFFF; +}