我正在写一个将浮点数除以2的算法。
在数字已经被规范化的情况下(指数位大于0),我认为这个过程非常简单我认为简单地将指数字段减少一个,然后再将该值粘回是一个正确的方法。
我很难想出如何处理已经被非规范化的浮点数(指数位都是0)。
我明白什么是非标准化的数字,相信我一般都明白把它们分开意味着什么我正在运行我通过另一个程序编写的算法,这里有一条消息让我困惑:
将值0x7fffff传递给函数将返回3fffff函数应该返回0x400000。
我真的不明白这里发生了什么,为什么要返回这个指定的值有没有人可以尝试解释这一点,以及为什么它应该返回这个值?
我最初处理非规范化数字的方法是将小数位数右移1(除以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;
}

最佳答案

在非规范化的情况下,您可能需要舍入该值对于0x7fffff您将在移位时切断最后的1位。似乎您需要将值取整,例如:

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

如果你是要围捕或下降也可能取决于标志。

关于c - 用非正规数除以2,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9090353/

10-10 17:42