0

C++ プログラムで正しく読み取れるように、一連の Java float をリトル エンディアンに変換する必要があります。私は大量のフロートを扱っています。

ByteBuffer、GeoSoft、および Apache Commons I/O ユーティリティを試しました。約 1% の確率で、浮動小数点数の一部が IntBits に変換されると、NaN 値として認識されるようです。問題を解決するために FLOAT.floatToRawIntBits を試してみましたが、役に立ちませんでした。

私が話していることの例として、問題が発生したときの具体的な例を挙げています。

以下は、正しくスワップされた一連の float です。

8.93516466e-02
-1.0571138
-2.2298267
0.042286094
0.8592236
0.5098497
0.67256117

しかし、私はこれを見ています:

6.9055E-41
-1.0571138
-2.2298267
0.042286094
0.8592236
0.5098497
0.67256117

NaN として認識されるビットのシーケンスを「吸収」する方法を教えてください。

バイトスワップを容易にするために使用したコードを貼り付けています。

 public static float swap (float value)
  {
    int intValue = Float.floatToRawIntBits (value);
    intValue = swap (intValue);
    return Float.intBitsToFloat (intValue);
  }

 public static int swap (int value)
  {
    int b1 = (value >>  0) & 0xff;
    int b2 = (value >>  8) & 0xff;
    int b3 = (value >> 16) & 0xff;
    int b4 = (value >> 24) & 0xff;
    return b1 << 24 | b2 << 16 | b3 << 8 | b4 << 0;
  }

この場合の問題番号は 8.93516466e-02 です。

スワップの前後のビットを印刷して、これを得ました:

111101101101101111110111111111
11111111111111011011011000111101

これは、これを出力するための私のコードです -- 間違っているか教えてください:

public static float testSwap (float value)
{
    int intValue = Float.floatToRawIntBits (value);
    System.out.println(Integer.toBinaryString(intValue));
    intValue = swap (intValue);
    System.out.println(Integer.toBinaryString(intValue));
        return Float.intBitsToFloat (intValue);
}
4

1 に答える 1

2

バイトをスワップして float を別の float に変換することはできません。元のint値を持っている必要があります。そうしないと、ご覧のように一部の値が破損します。これは、float がその値を正規化し、すべてのビット パターンが Java で有効であるとは限らないためです。

ネイティブバイトオーダーで FloatBuffer に ByteBuffer を使用して読むことをお勧めします。このようにして、価値観を壊すことはありません。

于 2013-07-18T22:25:26.007 に答える