Fixed con_float for non-IEEE machines

This commit is contained in:
ceriel 1990-12-03 16:00:53 +00:00
parent 4c99b235ed
commit 17af2902eb

View file

@ -131,6 +131,37 @@ float_cst(str, sz, buf)
e.flt_exp = 0;
}
}
#endif
#ifndef IEEEFLOAT
if (sz == 4 && (e.flt_mantissa.flt_h_32 & 0x80)) {
/* rounding */
if ((e.flt_mantissa.flt_h_32 & 0xffffff00) == 0xffffff00) {
e.flt_exp++;
e.flt_mantissa.flt_h_32 = 0x80000000;
}
else {
e.flt_mantissa.flt_h_32 += 0x80;
}
}
if (sz == 8 && (e.flt_mantissa.flt_l_32 & 0x80)) {
/* rounding */
if ((e.flt_mantissa.flt_l_32 & 0xffffff00) == 0xffffff00) {
e.flt_mantissa.flt_l_32 = 0;
if (e.flt_mantissa.flt_h_32 == 0xffffffff) {
e.flt_exp++;
e.flt_mantissa.flt_h_32 = 0x80000000;
}
else e.flt_mantissa.flt_h_32++;
}
else {
e.flt_mantissa.flt_l_32 += 0x80;
}
}
if (e.flt_exp > 255) {
overflow = 1;
e.flt_exp = 255;
e.flt_mantissa.flt_h_32 = e.flt_mantissa.flt_l_32 = 0xffffffff;
}
#endif
buf[I0] = (e.flt_sign << 7) | (e.flt_exp >> 1);
buf[I1] = ((e.flt_exp&1) << 7) |
@ -157,10 +188,11 @@ float_cst(str, sz, buf)
/* rounding */
if ((e.flt_mantissa.flt_l_32 & 0xfffff800) == 0xfffff800) {
e.flt_mantissa.flt_l_32 = 0;
if ((e.flt_mantissa.flt_h_32 += 1) == 0) {
if (e.flt_mantissa.flt_h_32 == 0xffffffff) {
e.flt_exp++;
e.flt_mantissa.flt_h_32 = 0x80000000;
}
else e.flt_mantissa.flt_h_32++;
}
else {
e.flt_mantissa.flt_l_32 += 0x400;