some minor improvements
This commit is contained in:
parent
1ae683e3b3
commit
35c612b99b
|
@ -16,20 +16,19 @@ flt_arith2flt(n, e)
|
||||||
*/
|
*/
|
||||||
register int i;
|
register int i;
|
||||||
|
|
||||||
if (n == 0) {
|
|
||||||
e->flt_exp = 0;
|
|
||||||
e->flt_sign = 0;
|
|
||||||
e->m1 = e->m2 = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
e->flt_sign = 1;
|
e->flt_sign = 1;
|
||||||
n = -n;
|
n = -n;
|
||||||
}
|
}
|
||||||
else e->flt_sign = 0;
|
else e->flt_sign = 0;
|
||||||
e->flt_exp = 63;
|
|
||||||
e->m1 = e->m2 = 0;
|
e->m1 = e->m2 = 0;
|
||||||
|
if (n == 0) {
|
||||||
|
e->flt_exp = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
e->flt_exp = 63;
|
||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
|
/* n = MINARITH */
|
||||||
n = 0x40000000;
|
n = 0x40000000;
|
||||||
while ((n << 1) > 0) n <<= 1;
|
while ((n << 1) > 0) n <<= 1;
|
||||||
e->flt_exp++;
|
e->flt_exp++;
|
||||||
|
|
|
@ -16,13 +16,12 @@ flt_chk(e)
|
||||||
flt_status = FLT_OVFL;
|
flt_status = FLT_OVFL;
|
||||||
e->flt_exp = EXT_MAX;
|
e->flt_exp = EXT_MAX;
|
||||||
e->m1 = 0x80000000;
|
e->m1 = 0x80000000;
|
||||||
e->m2 = 0;
|
|
||||||
}
|
}
|
||||||
if (e->flt_exp <= EXT_MIN) {
|
if (e->flt_exp <= EXT_MIN) {
|
||||||
flt_status = FLT_UNFL;
|
flt_status = FLT_UNFL;
|
||||||
e->flt_exp = 0;
|
e->flt_exp = 0;
|
||||||
e->m1 = 0;
|
e->m1 = 0;
|
||||||
e->m2 = 0;
|
|
||||||
e->flt_sign = 0;
|
e->flt_sign = 0;
|
||||||
}
|
}
|
||||||
|
e->m2 = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,8 +14,8 @@ flt_cmp(e1, e2)
|
||||||
int sign;
|
int sign;
|
||||||
int tmp;
|
int tmp;
|
||||||
|
|
||||||
if (e1->flt_exp == 0 && e1->m1 == 0 && e1->m2 == 0 &&
|
if (e1->m1 == 0 && e1->m2 == 0 &&
|
||||||
e2->flt_exp == 0 && e2->m1 == 0 && e2->m2 == 0) {
|
e2->m1 == 0 && e2->m2 == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
sign = e1->flt_sign ? -1 : 1;
|
sign = e1->flt_sign ? -1 : 1;
|
||||||
|
|
|
@ -51,6 +51,7 @@ flt_div(e1,e2,e3)
|
||||||
*/
|
*/
|
||||||
for (j = 0; j <= 3; j++, u_p++) {
|
for (j = 0; j <= 3; j++, u_p++) {
|
||||||
long q_est, temp;
|
long q_est, temp;
|
||||||
|
long v1 = v[1];
|
||||||
|
|
||||||
if (j == 2) lp++;
|
if (j == 2) lp++;
|
||||||
if (u_p[0] == 0 && u_p[1] < v[1]) continue;
|
if (u_p[0] == 0 && u_p[1] < v[1]) continue;
|
||||||
|
@ -62,22 +63,22 @@ flt_div(e1,e2,e3)
|
||||||
q_est = temp;
|
q_est = temp;
|
||||||
}
|
}
|
||||||
else if (temp >= 0) {
|
else if (temp >= 0) {
|
||||||
q_est = temp / (long)v[1];
|
q_est = temp / v1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
long rem;
|
long rem;
|
||||||
q_est = (0x7FFFFFFF/(long)v[1])+((temp&0x7FFFFFFF)/(long)v[1]);
|
q_est = (0x7FFFFFFF/v1)+((temp&0x7FFFFFFF)/v1);
|
||||||
rem = (0x7FFFFFFF%(long)v[1])+((temp&0x7FFFFFFF)%(long)v[1])+1;
|
rem = (0x7FFFFFFF%v1)+((temp&0x7FFFFFFF)%v1)+1;
|
||||||
while (rem > (long)v[1]) {
|
while (rem > v1) {
|
||||||
q_est++;
|
q_est++;
|
||||||
rem -= v[1];
|
rem -= v1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
temp -= q_est * (long)v[1];
|
temp -= q_est * v1;
|
||||||
while (!(temp&0xFFFF0000) &&
|
while (!(temp&0xFFFF0000) &&
|
||||||
ucmp((long)v[2]*q_est,(temp<<16)+(long)u_p[2]) > 0) {
|
ucmp((long)v[2]*q_est,(temp<<16)+(long)u_p[2]) > 0) {
|
||||||
q_est--;
|
q_est--;
|
||||||
temp += v[1];
|
temp += v1;
|
||||||
}
|
}
|
||||||
/* Now, according to Knuth, we have an estimate of the
|
/* Now, according to Knuth, we have an estimate of the
|
||||||
quotient, that is either correct or one too big, but
|
quotient, that is either correct or one too big, but
|
||||||
|
@ -97,14 +98,14 @@ flt_div(e1,e2,e3)
|
||||||
k = (tmp >> 16) & 0xFFFF;
|
k = (tmp >> 16) & 0xFFFF;
|
||||||
}
|
}
|
||||||
k += borrow;
|
k += borrow;
|
||||||
borrow = u_p[0] < k;
|
borrow = (long)u_p[0] < k;
|
||||||
u_p[0] -= k;
|
u_p[0] -= k;
|
||||||
|
|
||||||
if (borrow) {
|
if (borrow) {
|
||||||
/* So, this does not happen often; the estimate
|
/* So, this does not happen often; the estimate
|
||||||
was one too big; correct this
|
was one too big; correct this
|
||||||
*/
|
*/
|
||||||
*lp |= (j & 1) ? (q_est - 1) : ((q_est-1)<<16);
|
q_est--;
|
||||||
borrow = 0;
|
borrow = 0;
|
||||||
for (i = maxv; i > 0; i--) {
|
for (i = maxv; i > 0; i--) {
|
||||||
long tmp
|
long tmp
|
||||||
|
@ -115,7 +116,7 @@ flt_div(e1,e2,e3)
|
||||||
}
|
}
|
||||||
u_p[0] += borrow;
|
u_p[0] += borrow;
|
||||||
}
|
}
|
||||||
else *lp |= (j & 1) ? q_est : (q_est<<16);
|
*lp |= (j & 1) ? q_est : (q_est<<16);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
e3->m1 = result[0];
|
e3->m1 = result[0];
|
||||||
|
|
|
@ -208,8 +208,6 @@ add_exponent(e, exp)
|
||||||
while (divsz >= BIGSZ) {
|
while (divsz >= BIGSZ) {
|
||||||
flt_mul(&x, neg ? &r_big_10pow[BIGSZ-1] : &big_10pow[BIGSZ-1],&x);
|
flt_mul(&x, neg ? &r_big_10pow[BIGSZ-1] : &big_10pow[BIGSZ-1],&x);
|
||||||
divsz -= BIGSZ-1;
|
divsz -= BIGSZ-1;
|
||||||
flt_chk(e);
|
|
||||||
if (flt_status != 0) return;
|
|
||||||
}
|
}
|
||||||
flt_mul(&x, (neg ? r_big_10pow : big_10pow) + divsz, e);
|
flt_mul(&x, (neg ? r_big_10pow : big_10pow) + divsz, e);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue