-1

そのため、このアイデアを実装するのに苦労しています。基本的に、引数「uf」を取り、それを否定したいだけです。私は引数を 32 ビットの符号なし整数として扱っています。これは、単精度浮動小数点数がどのように見えるかということと、一種の等価物として機能します。同じように動作するはずです: 符号付きビット、指数の 8 ビット、小数の 23 ビット。

ただし、引数が NaN の場合は、引数を返すだけで済みます。理想的には、キャストや高レベルの操作なしでこれを実装できるようにしたいと考えています。どうやら、ビット単位の演算と整数/符号なし演算 (if、while、||、&&) だけで実行できるはずです。

どこから始めればよいかわかりませんか?「uf」の各部分を抽出し、それらをすべて個別に (ビットごとの演算子を使用して) 否定し、最後にそれらをすべて追加するだけでよいでしょうか? 否定には (~uf) + 1 を使用する可能性があります。

NaN の場合、8 ビット部分 (exp) のすべての 1 と小数部分の 0 以外をチェックする必要があることを認識しています (それ以外の場合は無限大と見なされます)。

繰り返しますが、これは 32 ビット システムの C で行われます。

4

3 に答える 3

0

あなたがしなければならないのは、符号ビットを反転させることだけです。つまり

x ^ 0x80000000

値がNaNの場合、符号ビットを反転してもNaNのままです。

否定は、入力値と同じNaNを返す必要がある浮動小数点演算とは見なされないため、浮動小数点否定用にコンパイラーによって生成されることがよくあります。

于 2012-10-18T22:54:24.117 に答える
0
x ^                        // flip signbit if not NaN
    (0x80000000 &          // isolate the signbit
      ~(                   // together, set signbit iff not NaN
         ((x & expmask) + expone) & // sets the signbit iff exp == 11111111
         -(x & mantmask))) // sets signbit only if the mantissa bits aren't zero
于 2012-10-18T22:34:09.977 に答える
0

私は実際に正しい解決策を見つけることができました。これらのアイデアはすべて役に立ちました。ただし、コードを検証するためにチェッカーを実行する必要があり、それが間違っていたのは、符号付きビットがゼロで、それ以外がすべて NaN だったときだけでした。したがって、私のチェック (frac) != 0.

unsigned float_neg(unsigned uf) 
{

unsigned exp = (uf >> 23) & 0xFF;  //get only the exponential part of the number
unsigned frac = (uf << 9);  //get only the fractional part of the number
if ((exp == 0xFF) && (frac) != 0) 
{
  return uf; //NaN so return 'uf'
}

return uf ^ (1 << 31);  //just apply a simple sign change to the 's' component
}
于 2012-10-20T00:53:20.123 に答える