【发布时间】:2014-09-08 21:36:00
【问题描述】:
我正在做一个家庭作业,我们应该通过按位运算将 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 可能重复,但问题没有得到正确回答。
【问题讨论】:
-
1
-
x = -x 是未定义的行为,如果 x = INT_MIN 和 INT_MIN != - INT_MAX。
-
1
-
没错,我添加了一个特殊的 if 来检查这种情况。但是,问题是如何修复舍入错误,这无法解决。
-
James, 1
标签: c bit-manipulation rounding floating floating-point-conversion