C 转换为按位浮点时的舍入点问题
我正在做一个家庭作业,我们应该通过按位运算将int转换成float。以下代码有效,但遇到舍入。我的函数似乎总是向下取整,但在某些情况下它应该向上取整 例如,0x80000001应表示为0xcf000000(指数31,尾数0),但我的函数返回0xCEFFFFF。(指数30,尾数0xffffff) 我不知道如何继续解决这些舍入问题。我应该采取什么步骤来实现这一点C 转换为按位浮点时的舍入点问题,c,bit-manipulation,rounding,floating,floating-point-conversion,C,Bit Manipulation,Rounding,Floating,Floating Point Conversion,我正在做一个家庭作业,我们应该通过按位运算将int转换成float。以下代码有效,但遇到舍入。我的函数似乎总是向下取整,但在某些情况下它应该向上取整 例如,0x80000001应表示为0xcf000000(指数31,尾数0),但我的函数返回0xCEFFFFF。(指数30,尾数0xffffff) 我不知道如何继续解决这些舍入问题。我应该采取什么步骤来实现这一点 unsigned float_i2f(int x) { if(x==0) return 0; int sign = 0; if
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);
}
unsigned float_i2f(int x){
如果(x==0)返回0;
int符号=0;
如果(x在计算尾数时,您显然忽略了y的最低8位
通常的规则称为“四舍五入到最接近的偶数”:如果y的最低8位大于0x80,则将尾数增加1。如果y的最低8位为0x80,且第8位为1,则将尾数增加1。在任何一种情况下,如果尾数变为大于等于0x1000000,则将尾数向右移动并增加指数。1 x=-x是未定义的行为,如果x=INT_MIN和INT_MIN!=-INT_MAX.1这是真的,我有添加了一个特殊的if来检查这种情况。但是,问题是如何修复舍入错误,这并不能修复。James,1@gnasher729我想在第二种情况下,您应该说“y的最低8位为0x80,第9位为1”