Fixed con_float for non-IEEE machines
This commit is contained in:
parent
4c99b235ed
commit
17af2902eb
1 changed files with 33 additions and 1 deletions
|
@ -131,6 +131,37 @@ float_cst(str, sz, buf)
|
||||||
e.flt_exp = 0;
|
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
|
#endif
|
||||||
buf[I0] = (e.flt_sign << 7) | (e.flt_exp >> 1);
|
buf[I0] = (e.flt_sign << 7) | (e.flt_exp >> 1);
|
||||||
buf[I1] = ((e.flt_exp&1) << 7) |
|
buf[I1] = ((e.flt_exp&1) << 7) |
|
||||||
|
@ -157,10 +188,11 @@ float_cst(str, sz, buf)
|
||||||
/* rounding */
|
/* rounding */
|
||||||
if ((e.flt_mantissa.flt_l_32 & 0xfffff800) == 0xfffff800) {
|
if ((e.flt_mantissa.flt_l_32 & 0xfffff800) == 0xfffff800) {
|
||||||
e.flt_mantissa.flt_l_32 = 0;
|
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_exp++;
|
||||||
e.flt_mantissa.flt_h_32 = 0x80000000;
|
e.flt_mantissa.flt_h_32 = 0x80000000;
|
||||||
}
|
}
|
||||||
|
else e.flt_mantissa.flt_h_32++;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
e.flt_mantissa.flt_l_32 += 0x400;
|
e.flt_mantissa.flt_l_32 += 0x400;
|
||||||
|
|
Loading…
Reference in a new issue