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

时间:2011-02-01 08:02:41

标签: clojure floating-point numpy endianness

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

  

读取四个输入字节并返回a   浮动值。它首先是这样做的   完全构造一个int值   然后是readInt方法的方式   将此int值转换为float   完全按照方法的方式   Float.intBitsToFloat。这个方法是   适合读取写入的字节   接口的writeFloat方法   DataOutput中。

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

(0 -64 121 -60 0 -64 121 -60 0 -64 121 -60)

Clojure / java将此视为重复1.7676097E-38,而NumPy和Python将其视为重复-999.0。作为参考,我正在使用this dataset

3 个答案:

答案 0 :(得分: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

下一步是要么以字节数组的形式读取整个文件,要么从FileChannel创建FileInputStream,然后对其进行mmap并从生成的mmaped ByteBuffer中读取使用.getFloat

答案 1 :(得分:0)

您可以将文件读取为字节,更改字节序,将这些字节写入内存中的流,然后再次使用DataInputStream以浮点形式读取它们。

答案 2 :(得分:0)

看起来该数据集以netCDF格式提供。 python + numpy和java都有netCDF库。这些库几乎可以解决所有可移植性问题,并且可能对性能没有太大影响。

将数字保存到文件几乎是一个解决的问题。你不应该在字面意义重要的层面上工作,除非你这样做是为了好玩。