我正在做一个家庭作业,我们应该通过按位操作将int转换为float。以下代码有效,但遇到舍入除外。我的功能似乎总是向下舍入,但在某些情况下它应该向上舍入。
例如,0x80000001应表示为0xcf000000(指数31,尾数0),但我的函数返回0xceffffff。 (指数30,尾数0xffffff)。
我不确定如何继续解决这些舍入问题。我应该采取哪些步骤才能使这项工作成功?
unsigned float_i2f(int x) {
if(x==0) return 0;
int sign = 0;
if(x<0) {
sign = 1<<31;
x = -x;
}
unsigned y = x;
unsigned exp = 31;
while ((y & 0x80000000) == 0)
{
exp--;
y <<= 1;
}
unsigned mantissa = y >> 8;
return sign | ((exp+127) << 23) | (mantissa & 0x7fffff);
}
this可能重复,但问题未得到妥善解答。
答案 0 :(得分:1)
当你计算尾数时,你显然忽略了y的最低8位。
通常的规则称为“舍入到最近的偶数”:如果y的最低8位是> 0x80然后将尾数增加1.如果y的最低8位= 0x80且位8为1则将尾数增加1.在任何一种情况下,如果尾数变为&gt; = 0x1000000,则将尾数向右移动并增加指数。