improved rounding
This commit is contained in:
parent
d277946286
commit
98f011552e
1 changed files with 24 additions and 9 deletions
|
@ -77,6 +77,16 @@ float_cst(str, sz, buf)
|
||||||
e.flt_exp += 127;
|
e.flt_exp += 127;
|
||||||
if (e.flt_mantissa.flt_h_32 == 0) e.flt_exp = 0;
|
if (e.flt_mantissa.flt_h_32 == 0) e.flt_exp = 0;
|
||||||
#ifdef IEEEFLOAT
|
#ifdef IEEEFLOAT
|
||||||
|
if (e.flt_mantissa.flt_l_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 (e.flt_exp >= 255) {
|
if (e.flt_exp >= 255) {
|
||||||
overflow = 1;
|
overflow = 1;
|
||||||
e.flt_exp = 255;
|
e.flt_exp = 255;
|
||||||
|
@ -111,6 +121,19 @@ float_cst(str, sz, buf)
|
||||||
else {
|
else {
|
||||||
e.flt_exp += 1023;
|
e.flt_exp += 1023;
|
||||||
if (e.flt_mantissa.flt_h_32 == 0) e.flt_exp = 0;
|
if (e.flt_mantissa.flt_h_32 == 0) e.flt_exp = 0;
|
||||||
|
if (e.flt_mantissa.flt_l_32 & 0x400) {
|
||||||
|
/* 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) {
|
||||||
|
e.flt_exp++;
|
||||||
|
e.flt_mantissa.flt_h_32 = 0x80000000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
e.flt_mantissa.flt_l_32 += 0x400;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (e.flt_exp >= 2047) {
|
if (e.flt_exp >= 2047) {
|
||||||
overflow = 1;
|
overflow = 1;
|
||||||
e.flt_exp = 2047;
|
e.flt_exp = 2047;
|
||||||
|
@ -134,15 +157,7 @@ float_cst(str, sz, buf)
|
||||||
flt_b64_sft(&(e.flt_mantissa), -53);
|
flt_b64_sft(&(e.flt_mantissa), -53);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
i = sz-1;
|
if (overflow) {
|
||||||
if (! overflow && (e.flt_mantissa.flt_h_32 & 0x80000000)) for (; i>=0; i--) {
|
|
||||||
if ((buf[i] &0377) != 0377) {
|
|
||||||
buf[i]++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else buf[i] = 0;
|
|
||||||
}
|
|
||||||
if (overflow || i < 0) {
|
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in a new issue