【问题标题】:Rounding point issues when converting to float bitwise转换为按位浮点数时的舍入点问题
【发布时间】: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


【解决方案1】:

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

通常的规则称为“四舍五入”:如果 y 的最低 8 位 > 0x80,则尾数加 1。如果 y 的最低 8 位 = 0x80 且第 8 位为 1,则尾数增加1. 在任何一种情况下,如果尾数变为 >= 0x1000000,则将尾数右移并增加指数。

【讨论】:

  • @gnasher729 在第二种情况下,我想你想说“y 的最低 8 位 = 0x80,第 9 位为 1”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-08
  • 2018-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
  • 1970-01-01
相关资源
最近更新 更多