转换为按位浮点时的舍入点问题

时间:2014-09-08 21:36:01

标签: c bit-manipulation rounding floating floating-point-conversion

我正在做一个家庭作业,我们应该通过按位操作将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 个答案:

答案 0 :(得分:1)

当你计算尾数时,你显然忽略了y的最低8位。

通常的规则称为“舍入到最近的偶数”:如果y的最低8位是> 0x80然后将尾数增加1.如果y的最低8位= 0x80且位8为1则将尾数增加1.在任何一种情况下,如果尾数变为&gt; = 0x1000000,则将尾数向右移动并增加指数。