1

我正在编写一个将浮点数除以 2 的算法。对于已经标准化的数字(指数位 > 0),我认为该过程非常简单。我认为简单地将指数字段减少一个然后将该值重新插入是一种正确的方法。

我无法想出如何处理已经被非规范化的浮点数(指数位都是 0)。我了解非规范化数字是什么,并且相信我通常了解将它们分开意味着什么。我正在运行我通过另一个程序编写的算法,这是我得到的一条让我感到困惑的消息:

将值 0x7fffff 传递给函数返回 3fffff。该函数应该返回 0x400000。

我真的不明白这里发生了什么,以及为什么应该返回这个指定的值。有没有人可以尝试解释这一点以及为什么它应该返回这个值?

我处理非规范化数字的初始方法是将分数位右移一位(除以 2),这似乎不是所需的过程。

这是我所拥有的:

unsigned float_half(unsigned uf) {

  unsigned exp = uf & (0x7F800000);
  unsigned sign = uf & (0x80000000);
  unsigned fract = uf & (0x007FFFFF);
  // Check for NaN or infinity
  if(exp == 0x7F800000) {
    return uf;
  }
  // Check for denormalized numbers
  if(exp == 0x00000000) {
    // Need to do something here, not really sure...

    return sign | exp | fract;
  } 
  // Check for exponent of 1 (going to a denormalized number changes things)
  if(exp == 0x00800000) {
    fract = (0x00FFFFFF & uf) >> 1;
    return fract | sign;
  }

  exp--;
  exp = exp & (0x7F800000);
  return sign | exp | fract;
}
4

2 回答 2

4

该函数应该返回0x400000是为了满足四舍五入模式。这是我的功能:

unsigned float_half(unsigned uf){
    unsigned sign = uf & (0x80000000);
    unsigned exp = uf >> 23 & 0xff;
    unsigned frac = f & 0x7fffff;

    if(exp == 0xff)
        return uf;
    else if (exp > 1)
        return sign | --exp << 23 | frac;
    else {
        if (exp == 1)
            frac |= 1 << 23;
        if ((frac & 3) == 3)
            frac++;
        frac >>= 1;
        return sign | frac;
    }
}

其他

unsigned float_half(unsigned uf){
    unsigned sign = uf & (0x80000000);
    unsigned exp_frac = uf & 0x7fffffff;

    if (exp_frac >= 0x7f800000)
        return uf;
    else if (exp_frac > 0x00ffffff)
        return uf + 0xff800000;
    else {
        if ((exp_frac & 3) == 3)
            exp_frac++;
        exp_frac >> 1;
        return sign | exp_frac;
    }
}
于 2012-05-11T07:25:40.000 回答
2

您可能应该对非规范化情况下的值进行四舍五入。因为你正在用班次0x7fffff切断最后一点。1似乎您应该将值向上舍入,例如:

if(exp == 0x00000000) {
  fract = (0x00FFFFFF & uf) >> 1;
  if (0x00000001 & uf)
    fract++;
  return fract | sign;
}

如果你应该向上或向下舍入也可能取决于标志。

于 2012-02-01T03:43:49.977 回答