NumPy和Clojure/Java之间浮动的差异

Sam*_*hie 2 floating-point numpy clojure endianness

有没有人有任何关于如何使用java或clojure从二进制文件中读取浮点值的建议?我将我当前的值与Python的NumPy nump.fromfile('path', dtype="f")方法的结果进行比较,而我根本得不到相同的答案.我怀疑这是因为Java的DataInputStream.readFloat()方法假定二进制文件是由java编写的,如本文档所示:

读取四个输入字节并返回一个浮点值.它通过首先以readInt方法的方式构造一个int值,然后将此int值完全按照方法Float.intBitsToFloat的方式转换为float来实现.此方法适用于读取由接口DataOutput的writeFloat方法写入的字节.

所以,我认为java正在向后读取浮点值.前十二个字节是:

(0 -64 121 -60 0 -64 121 -60 0 -64 121 -60)
Run Code Online (Sandbox Code Playgroud)

Clojure/java认为这是重复的1.7676097E-38,而NumPy和Python认为它重复了-999.0.作为参考,我正在使用这个数据集.

cgr*_*and 6

Java在java.io中使用"网络顺序"(big endian).但是java.nio允许您选择要应用的字节序:

user=> (-> (map byte [0 -64 121 -60]) byte-array java.nio.ByteBuffer/wrap 
         (.order java.nio.ByteOrder/LITTLE_ENDIAN) .getFloat)
-999.0
Run Code Online (Sandbox Code Playgroud)

下一步是要么在一个字节数组中读取整个文件,要么FileChannel从a 创建一个FileInputStream,然后mmap它并ByteBuffer使用生成的mmaped读取.getFloat.