65

2 つのプロセッサで実行されているプログラムがありますが、そのうちの 1 つは浮動小数点をサポートしていません。そのため、そのプロセッサで固定小数点を使用して浮動小数点計算を実行する必要があります。そのために、浮動小数点エミュレーション ライブラリを使用します。

最初に、浮動小数点をサポートするプロセッサ上の浮動小数点数の符号、仮数、および指数を抽出する必要があります。それで、私の質問は、単精度浮動小数点数の符号、仮数、および指数を取得する方法です。

この図の形式に従って、

ここに画像の説明を入力 それは私がこれまで行ってきたことですが、符号を除いて、仮数と指数はどちらも正しくありません。何かが足りないと思います。

void getSME( int& s, int& m, int& e, float number )
{
    unsigned int* ptr = (unsigned int*)&number;

    s = *ptr >> 31;
    e = *ptr & 0x7f800000;
    e >>= 23;
    m = *ptr & 0x007fffff;
}
4

7 に答える 7

33

ユニオンを使用してキャストを行う方が良いと思います。より明確です。

#include <stdio.h>

typedef union {
  float f;
  struct {
    unsigned int mantisa : 23;
    unsigned int exponent : 8;
    unsigned int sign : 1;
  } parts;
} float_cast;

int main(void) {
  float_cast d1 = { .f = 0.15625 };
  printf("sign = %x\n", d1.parts.sign);
  printf("exponent = %x\n", d1.parts.exponent);
  printf("mantisa = %x\n", d1.parts.mantisa);
}

http://en.wikipedia.org/wiki/Single_precisionに基づく例

于 2013-03-28T15:06:37.663 に答える
25

浮動小数点を直接サポートする CPU で使用される浮動小数点数の形式を調べ、それらの部分に分解します。最も一般的な形式はIEEE-754です。

または、この回答に示されているように、いくつかの特別な関数 (double frexp(double value, int *exp);および)を使用してこれらのパーツを取得することもできます。double ldexp(double x, int exp);

別のオプション%aは、と一緒に使用することprintf()です。

于 2013-03-28T15:05:58.650 に答える
11

あなたは&間違ったビットをingしています。私はあなたが欲しいと思います:

s = *ptr >> 31;
e = *ptr & 0x7f800000;
e >>= 23;
m = *ptr & 0x007fffff;

&設定していないビットをゼロに設定していることに注意してください。したがって、この場合、指数を取得するときに符号ビットをゼロに設定し、仮数を取得するときに符号ビットと指数をゼロに設定します。

マスクは写真から直接取得されることに注意してください。したがって、指数マスクは次のようになります。

0 11111111 0000000000000000000000

仮数マスクは次のようになります。

0 00000000 111111111111111111111

于 2013-03-28T15:07:09.937 に答える