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

これらの数値は、8 ビットの指数、23 ビットの仮数、および 1 ビットの符号を持つ 32 ビットの浮動小数点表現に基づいています。これにより、指数を -126 から 127 の範囲にすることができます (-127 は非正規化数に使用されます) が、ビット演算で使用される符号なしの値にするには、指数に 127 を追加する必要があります。非正規化を許可すると、仮数の値をシフトすることでより小さな数値を取得できます。23 個の仮数ビットがあるため、指数を -126-23 = -149 に下げることができます。

64 ビット浮動小数点を使用している場合は、対応するフィールドのサイズに基づいてこれらを増やす必要があります。たとえば、指数が 16 ビットで仮数が 47 ビットの場合、-65581、-65534、および 65535 になります。

于 2013-05-02T04:51:11.770 に答える