if (e->flt_exp >= EXT_MAX) {
flt_status = FLT_OVFL;
e->flt_exp = EXT_MAX;
- e->m1 = e->m2 = 0;
+ e->m1 = 0x80000000;
+ e->m2 = 0;
}
if (e->flt_exp <= EXT_MIN) {
flt_status = FLT_UNFL;
e->flt_exp = 0;
- e->m1 = e->m2 = 0;
+ e->m1 = 0;
+ e->m2 = 0;
e->flt_sign = 0;
}
}
flt_cmp(e1, e2)
register flt_arith *e1, *e2;
{
- int sign = e1->flt_sign ? -1 : 1;
+ int sign;
int tmp;
+ if (e1->flt_exp == 0 && e1->m1 == 0 && e1->m2 == 0 &&
+ e2->flt_exp == 0 && e2->m1 == 0 && e2->m2 == 0) {
+ return 0;
+ }
+ sign = e1->flt_sign ? -1 : 1;
if (e1->flt_sign > e2->flt_sign) return -1;
if (e1->flt_sign < e2->flt_sign) return 1;
if (e1->flt_exp < e2->flt_exp) return -sign;
if ((e2->m1 | e2->m2) == 0) {
flt_status = FLT_DIV0;
e3->flt_exp = EXT_MAX;
- e3->m1 = e3->m2 = 0L;
+ e3->m1 = 0x80000000;
+ e3->m2 = 0L;
return;
}
if ((e1->m1 | e1->m2) == 0) { /* 0 / anything == 0 */
flt_nrm(e)
register flt_arith *e;
{
- if ((e->m1 | e->m2) == 0L)
+ if ((e->m1 | e->m2) == 0L) {
+ e->flt_exp = 0;
+ e->flt_sign = 0;
return;
+ }
/* if top word is zero mov low word */
/* to top word, adjust exponent value */
while (c = *s++, isdigit(c) || (c == '.' && ! dotseen++)) {
if (c == '.') continue;
digitseen = 1;
- if (e->m1 <= 0x7FFFFFFF/5) {
+ if (e->m1 >= 0 && e->m1 <= 0x7FFFFFFF/5) {
struct flt_mantissa a1;
a1 = e->flt_mantissa;
if (*s1) *s++ = *s1++;
else *s++ = '0';
}
- if ((e->m1 | e->m2) || e->flt_exp == EXT_MIN || e->flt_exp == EXT_MAX) {
+ if (e->m1 | e->m2) {
--dp ;
}
if (dp != 0) {