从 Matlab 中的二进制文件中读取 64 位整数不会给出正确的结果



编辑:问题是,即使指定输入 matlab 的精度,除非另行指定,否则仍会将它们转换为双精度。我的错误。

将一个简单的 64 位整数读入 matlab 似乎给出的值与我在 python 或 windows 计算器中进行转换时不同。

我有一个 8 字节长的小文件,其内容是

0x99, 0x1e, 0x6b, 0x40, 0x27, 0xe3, 0x01, 0x56

我在 matlab 中使用以下内容:

fid = fopen('test.data')
input = fread(fid, 1, 'int64')

我得到

input = 6197484319962505200

但是,使用 python 或 windows 计算器,我得到了不同的十进制表示形式 0x5601e327406b1e99 .两者都预测我应该得到 input = 6197484319962504857(与 343 不同)。这显然不是一个字节序问题,因为那样它就会很远。

我最初被引导来测试这一点,因为从大型二进制文件中读取双精度给出了奇怪的结果。然后我尝试将它们作为整数读取并手动比较。

我的问题是,我做错了什么,

是我忽略了什么,还是 matlab 在这里犯了错误?我正在使用win64 matlab R2010a。

问题似乎是fread实际上将其作为双精度读取:

>> class(input)
ans =
  double

因为这个数字太大了,所以这可能是最接近的双精度值。

如果我手动指定 matlab 变量应该int64,除了在源文件中指定类型之外,它对我有用(请参阅文档以获取fread):

>> input = fread(fid, 1, '*int64')
input =
  6197484319962504857

最新更新