2

したがって、このパズルを満たすメソッドを作成する必要があります。

float_f2i

  • 浮動小数点引数 f の式 (int) f に相当するビットレベルを返します。

  • 引数は unsigned int として渡されますが、単精度浮動小数点値のビットレベル表現として解釈されます。

  • 範囲外 (NaN および無限大を含む) は、0x80000000u を返す必要があります。

ここから得たのは、16 進数の数値が与えられ、それを整数形式にするコードを書かなければならないということです。私たちに与えられたテストケースは次のとおりです。 Argument [0x00800000], returns [0x0]0x00800000 は 1.1754....E-38 であるため、ゼロとして返されるほど小さい (だから私は仮定している)

私がこれまでに持っているものは次のとおりです。

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

  //takes care of NaN and inifinity
  if (exp == 255) {return 0x80000000u;}


  if ((exp > 0) && (exp < 255)) //normalized
  {
    if ((sign >> 28) == 0x0) //if sign bit is 0
    {
      return (0x1); //NEEDS MORE HERE
    }
    else if ((sign >> 28) == 0x8) //if sign bit is 1
    {
      return (0x8); //NEEDS MORE HERE
    }
  }
  else if (exp == 0)//denormalized
  {
    return 0; // rounds to zero anyway
  }
}

これが機能するには、return ステートメント (1.frac^(exp-127)) に指数部分を追加する必要があることはわかっていますが、それをコーディングする方法がわかりません。左にシフトすると 2 倍になりますが、 2 の負の指数の場合、右にシフトする必要がありますが、>> 演算子はそれを算術的に行います。算術シフトによって作成された 1 ビットを削除するために動的マスクを作成する必要がありますか?

編集:答えを得て、私は完全に間違った方向に進んでいた.誰かがこれをしなければならない場合の将来の参照:

int float_f2i(unsigned uf) {
  int exponent = (uf >> 23) & 0ff;
  int exp = exponent - 127;
  int frac = uf & 0x7fffff;

  if(exponent == 0x7F800000)
    return 0x80000000u;
  if(!exponent)
    return 0;
  if(exp < 0)
    return 0;
  if(exp > 30)
    return 0x80000000u;

  frac = frac | 0x800000;
  if (exp >= 23)
    frac = frac << (exp - 23);
  else
    frac = frac >> (23 - exp);

  if((uf >> 31) & 1)
    return ~frac + 1;

  return frac;
}
4

1 に答える 1