从fi读取16字节的Fortran浮点数到Python中

2024-06-16 12:48:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在将Fortran中的浮点序列写入二进制文件,并希望用Python读取它们。使用单精度和双精度浮点(kind=4)和(kind=8)都可以很好地工作,但是当我试图移动到实数(kind=16)变量类型时,突然之间事情就不起作用了(数据数组中填充了0)。我在这里读到: python read 16 bytes long double from binary file 需要一个解决方案np.fromfile文件功能。我实施了建议的更改,但仍然没有得到正确的结果。下面是Python和Fortran代码。我在python2.7+numpy1.8和python3.4+nump1.14中都尝试过,效果相同。我还检查了,生成的文件似乎有正确的数据量(480字节对应30个浮点,16个字节)。欢迎任何帮助!在

Python阅读器:

import numpy as np

inputfilename = "fortranData.bin"

dp = 8
nVals = 30

with open(inputfilename, 'rb') as f:
    # both work fine for 4 or 8 byte floats (32 and 64)
    # but not for 16 byte floats (np.float128)
    data = np.fromfile(f, dtype=np.float64)
    data = np.frombuffer(f.read(dp*nVals), dtype=np.float64, count=nVals)

print(data)

Fortran writer(在Ubuntu14.04上用gfortran 4.8.6编译)

^{pr2}$

编辑:根据要求,在fortranData.bin文件:

$od fortranData.bin 
0000000 000000 000000 000000 000000 000000 000000 000000 037777
0000020 000000 000000 000000 000000 000000 000000 000000 040000
0000040 000000 000000 000000 000000 000000 000000 100000 040000
0000060 000000 000000 000000 000000 000000 000000 000000 040001
0000100 000000 000000 000000 000000 000000 000000 040000 040001
0000120 000000 000000 000000 000000 000000 000000 100000 040001

Tags: 文件readdata字节binasnp浮点
1条回答
网友
1楼 · 发布于 2024-06-16 12:48:31

似乎numpy不支持IEEE四元组格式,据我所知,它只需要手动转换。例如,如果您以16字节的块读取文件,那么可以像这样转换块(尽管测试不好)

def rawQuadToDouble(raw):
    asint = int.from_bytes(raw, byteorder='little')
    sign = (-1.0) ** (asint >> 127);
    exponent = ((asint >> 112) & 0x7FFF) - 16383;
    significand = (asint & ((1 << 112) - 1)) | (1 << 112)
    return sign * significand * 2.0 ** (exponent - 112)

相关问题 更多 >