从C+中选择的Fortran类型读取和写入16字节双精度+;(其中系统长双精度为8字节) 我有一个二进制文件,用Fortran代码编写,我需要用C++来读取,编辑,然后重写为原来的格式。

从C+中选择的Fortran类型读取和写入16字节双精度+;(其中系统长双精度为8字节) 我有一个二进制文件,用Fortran代码编写,我需要用C++来读取,编辑,然后重写为原来的格式。,c++,types,binary,fortran,C++,Types,Binary,Fortran,文件的大部分内容很容易操作,但我遇到了一个问题类型。已使用以下命令写入该文件: integer, parameter :: long = selected_real_kind(18,4096) 并且随后具有许多类型的要读取/写入的值: real(long) 我已经能够确定这些值在原始二进制文件中存储为16字节,因此应该读入长双精度,但在我的系统中,长双精度只有8字节,读取错误 首先,有人能告诉我更多关于所选的实数类值如何存储为二进制的信息吗 其次,有人能推荐一种读写C++中的异常16字节二进

文件的大部分内容很容易操作,但我遇到了一个问题类型。已使用以下命令写入该文件:

integer, parameter :: long = selected_real_kind(18,4096)
并且随后具有许多类型的要读取/写入的值:

real(long)
我已经能够确定这些值在原始二进制文件中存储为16字节,因此应该读入长双精度,但在我的系统中,长双精度只有8字节,读取错误

首先,有人能告诉我更多关于所选的实数类值如何存储为二进制的信息吗

其次,有人能推荐一种读写C++中的异常16字节二进制实数的方法,它只能存储最多8字节的双倍?


编辑:这都是在Windows 10上使用Visual Studio 2017,因此GCC quadmath.h不适用。

这是否回答了您的问题?用于写入浮点值(任何类型)的二进制格式——事实上,大多数类型——都依赖于Fortran编译器。如果你有其他类型的工作,你就要嵌入一个特定的FORTRAN和C++编译器的假设,这在一般情况下是不正确的。实际上,,您最好编写Fortran代码来进行操作,这样,只要编写文件的程序和操作文件的程序使用相同的Fortran编译器构建,代码就可以工作,而不是使用特定于两个编译器的代码。在Fortran中,您可以问一个问题的
数值存储大小是多少实体,其中函数返回位数。我怀疑如果你打印*,数字存储大小(1.\u长)
,你会得到128。而且,如果你做
打印*,种类(1.\u long)
,你会得到10。因此,
REAL(long)
REAL(10)
相同,它需要10个字节(不是您声称的8个字节)。那么,为什么是128位呢?因为,在i386/x86\u 64上,10个字节被填充为16个字节以提高硬件利用率。Fortran的功能实际上没有什么特别之处,
selected\u real\u kind(184096)
没有任何神奇之处,它只指向内存大小为128位的浮点类型。如果您的编译器无法使用128位浮点类型(或80位浮点类型),则必须更改编译器或找到一些为您实现它们的库。当明确要求使用128位浮点时(同样/在内存中),Gfortran甚至可能在不同的平台上使用不同的类型。它可能使用10字节的字节(适合寄存器)或完整的16字节的字节(软件)。