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);
}