1

Cで数値を正規化する方法について少し混乱しています。浮動小数点バイナリ値1101.101のようなものがある場合、小数点を3桁左に移動することにより、1.101101 x 2^3として正規化されることを知っています。ただし、コードでこれを行う方法がわかりません。

したがって、10010000 exp 0 があり、01001000 exp 1 を取得したい場合、小数フィールドは「001」で、最終結果は 010001 です。

8 ビットの数値があり、先頭の 2 ビットが 00 の場合、1 が見つかるまでそれを移動します。または、先頭のビットが 01 の場合、それは既に正規化されています。同様に、11 の先頭の 2 ビットについては、左のビットに移動します。

したがって、私の数値が 32 ビットで、符号が 1、指数が 8、仮数が 23 の場合、次のようにします。

if ( (result >> 24) == "11") ) // although here I know I'm comparing an int with a string
   {
   //code to set result = to the new number
   }
if ( (result >> 24) == "01" ) )
   {
      return result; 
   }

そして、他の 2 つの先行ビット番号 (00、10) の if ステートメントがさらにいくつかありますか? 私のロジック/コードが正しいかどうかわかりません。

ありがとう。

4

2 に答える 2

1

IEEE 754 単精度形式


あなたが言うように、符号、仮数指数を抽出する必要があります。ウィキペディアから引用した上の図は、最も一般的な単精度浮動小数点形式である IEEE 754 のレイアウトを示しています。

各部分を抽出するには、以下に詳述する 3 つの手順でこれを行う必要があります。Cコードはありませんが、必要な手順を示します。3 つの部分を抽出したら、上の図に示されているビット位置に配置します。

1.サイン

符号なしの数値の場合、これは常に 0 です。

署名されている場合、MSB です。

2.指数

数値が符号付きで負の場合は、すべてのビットを反転し、1 を追加して正にする必要があります。そうでない場合は、そのままにしておくことができます。

指数を抽出するには、2 進小数点がどこにあるのかを知る必要があります。2 進小数点の位置をbとします (この例では 3 です)。

1 である MSB の最初のビットをpとします (この例では 6)。

指数をeとする:

e = 127 - (b - p)

3.仮数

これは、位置p-1からビット 0 までのビットに等しくなります。

于 2013-10-17T14:45:34.277 に答える
1

いいえ、正しくありません。

浮動小数点数はIEEE 754 Floating point formatで表されます。数値をシフトして正規化することはできません。

この形式で数値を表現する場合:

(+/-)1.M x 2E

次に、最初に符号ビット、仮数M、指数をE個別に抽出する必要があります。

次に、二項演算 (シフト、AND、OR など) を実行して、必要な方法で表現します。

于 2013-10-17T03:45:44.180 に答える