0

これは、このhttp://www.h-schmidt.net/FloatConverter/IEEE754.htmlとほぼ同じことを行うという考え方です 。

たとえば、357を接続すると、0x43b28000を取得する必要があります

float unsignedToFloat( unsigned int x ) {
unsigned int result = 0;

return *(float*)&result;
}

しかし、どうすればこれを行うことができますか?

c--printfを使用してieee754floatを16進数に変換します

私はこれを見ましたが、良い解決策はなかったようです。

4

2 に答える 2

3

まず、xがゼロの場合、ゼロを返します。

次に、 のゼロ以外の最上位ビットのインデックスを見つけますx。それを呼び出しますi

iが 24 未満の場合、正規化された仮数を取得するために左シフトxします。23 - iここで、ビット 23 をクリアして暗黙のビットを非表示にし、ビット 23:30 を127 + iバイアス指数である に設定します。結果を返します。

それ以外の場合は、切り捨てによって正規化された仮数を取得するために右シフトxi - 23て、暗黙のビットをクリアし、指数を上記のように設定します。目的の丸めモードが切り捨てまたはマイナス無限大への丸めである場合は、これで完了です。それ以外の場合は、 の下部からシフトされたビットを確認する必要がありますx。目的の丸めモードが「プラス無限大への丸め」であり、これらのビットのいずれかが設定されている場合は、結果に 1 を加えて返します。最後に、目的の丸めモードが最も近い同数に丸める (IEEE-754 のデフォルト) 場合は、次の 3 つのケースがあります。

  • 末尾のビットはb0...次のとおりです。切り捨てられた結果を返します。
  • 末尾のビットは次のb1000...とおりです。これは正確に中途半端なケースです。切り捨てられた結果を呼び出す場合はt、返す必要がありますt + (t&1)tつまり、が奇数の場合にのみ切り上げます。
  • 末尾のビットはb1...1...次のとおりです。切り捨てられた結果に 1 を追加して返します。
于 2013-03-15T11:28:06.147 に答える
1

私はそれをこのようにしました:

更新しました

これは0、INT_MIN、および丸めを正しく処理します、AFAICT:

#define SIGN_MASK       (1 << 31)
#define HIDDEN_MASK     (1 << 23)
#define MANTISSA_MASK   (HIDDEN_MASK - 1)

#define INT_MIN 0x80000000
#define INT_MAX 0x7FFFFFFF

float intToFloat(int n)
{
    int sign;
    int exp;
    unsigned int half;

    if (n == 0)
         return 0.0f;

    if (n == INT_MIN)
        return -(float)(INT_MIN);

    sign = n < 0 ? SIGN_MASK : 0;
    if (sign)
        n = -n;

    if (!(n & ~(HIDDEN_MASK | MANTISSA_MASK)))
        for (exp = 0; !(n & HIDDEN_MASK); n <<= 1, exp--) ;
    else
    {
        half = 0;
        for (exp = 0; n & ~(HIDDEN_MASK | MANTISSA_MASK); exp++)
        {
            half >>= 1;
            if (n & 1)
                half |= 0x80000000;
            n >>= 1;
        }
        if (half > INT_MIN || ((half == INT_MIN) && (n & 1) != 0))
        {
            n++;
            if (n == 0x1000000)
            {
                n = 0; // or 0x800000, doesn't matter.
                exp++;
            }
        }

    }

    exp = (exp + 127 + 23) << 23;
    n = (n & MANTISSA_MASK) | sign | exp;

    return *((float *)&n);
}
于 2013-03-15T13:31:26.607 に答える