理解2 ^ x的浮点表示

时间:2013-05-02 04:38:37

标签: floating-point

我得到了一个计算2 ^ x的浮点表示的函数。我确实理解了它的大部分内容,但是我对这个函数的嵌套if-else语句面临一些困惑:

/* Compute 2**x */
float fpwr2(int x) {

  unsigned exp, frac;
  unsigned u;

  if (x < -149) {
  /* Too small. Return 0.0 */
     exp = 0;
     frac = 0;
  } else if (x < -126) {
  /* Denormalized result */
     exp = 0;
     frac = 1 << (x + 149);
  } else if (x < 128) {
  /* Normalized result. */
     exp = x + 127;
     frac = 0;
  } else {
  /* Too big. Return +oo */
     exp = 255;
     frac = 0;
  }
  u = exp << 23 | frac;
  return u2f(u);
}

我的问题是,为什么选择这些特定数字(-149,-126,128)?如果,我正在计算2 ^ x的64位浮点表示,那些数字是否已更改? THX

2 个答案:

答案 0 :(得分:3)

查看single-precision floating point number的定义。

-126到127的范围是可以格式编码的指数。任何小于-126的内容都将被非规范化,因为小数部分中没有足够的位,并且任何大于127的内容(即>= 128)都无法表示。

小数部分中有23位可用,因此非正规化值可以在2 ^( - 126 - 1)和2 ^( - 126 - 23)之间。 -126 - 23 = -149。

是的,值将随64-bit floating point number而变化 - 指数范围从-1022到1023,并且分数中有52位。

答案 1 :(得分:1)

这些数字基于32位浮点表示,其具有8位指数,23位尾数和1位符号。这允许指数范围从-126到127(-127用于非规范化数字),但是必须向其添加127以使其达到位算术中使用的无符号值。当你允许非规范化时,你可以通过移动尾数中的值来获得更小的数字;因为有23个尾数位,所以你可以使用-126-23 = -149的指数。

如果您正在执行64位浮点运算,则应根据相应字段的大小增加这些浮点数。例如。如果它是16位指数和47位尾数,它们将是-65581,-65534和65535。