もともとVB.NETで書かれたプログラムをJavaに移植しています。32ビットフロートをリトルエンディアン順に格納するファイルから読み取っています。
元のプログラムはこれを行います:
Dim br As BinaryReader = ...
Dim f_vb As Single = br.ReadSingle
Javaはビッグエンディアンなので、floatに変換する前にバイトを逆にします。
RandomAccessFile raf = // ...
int i = raf.readInt();
int bigEndian = Integer.reverseBytes(i);
float f_java = Float.intBitsToFloat(bigEndian);
私が知る限りf_vb
、f_java
同じビットが含まれています。つまり、BitConverter.ToInt32
onf_vb
とFloat.floatToIntBits
(およびfloatToRawIntBits
)onf_java
は同じことをします。ただし、フロートは等しくありません。たとえば、bigEndian == 0x4969F52F
。Javaが報告958290.94
し、VB.NETが報告し958290.938
ます。これは、JVMとCLRが浮動小数点数を処理する方法の違いによるものだと思いますが、浮動小数点の問題については、その理由を理解するのに十分な知識がありません。この精度の低下が問題を引き起こしているので、原因を特定したいと思います。