2

我有一个计算 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 位浮点表示,这些数字会改变吗?谢谢

4

2 回答 2

3

请参阅单精度浮点数的定义。

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

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

是的,这些值将随64 位浮点数而变化- 指数范围从 -1022 到 1023,分数中有 52 位。

于 2013-05-02T04:51:37.027 回答
1

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

如果你在做 64 位浮点,你应该根据相应字段的大小来增加这些。例如,如果它是 16 位指数和 47 位尾数,它们将是 -65581、-65534 和 65535。

于 2013-05-02T04:51:11.770 回答