什么是在Fortran中完全表达双精度值的可移植格式?

时间:2018-05-16 19:59:35

标签: formatting fortran ascii precision portability

假设我希望以可移植的方式将双精度值写入ASCII文件的全精度。 (显然原始二进制输出是表达数字最紧凑的方式,但这不是我在这里要求的。)

我想要另一个程序,例如用MATLAB或Python,能够读取文件并存储与Fortran程序内部相同的精确值。

默认ASCII输出只需按如下方式完成:

ifort

据我所知,不同的编译器可能有不同的格式默认值和要求。例如, 3.14159265358979 3.1415926535897931 3.141592653589793 3.14159265358979311600 编译上面的示例没有问题,并产生以下输出:

gfortran
另一方面,

'(f)'(gcc版本4.8.2)需要第二个输出语句的宽度,因此编译失败。注释掉第二个输出语句 3.1415926535897931 3.141592653589793 3.14159265358979311600 允许编译,结果(这里添加一个空行)是:

nagfor

我无法访问real并且没有安装任何其他Fortran编译器,所以我不在这里测试它们。

您会注意到结果会有所不同。我希望没有一个结果是准确的,但精确到机器精度。当然,大多数用途都可以接受~15位数,但我对全精度输出很好奇,因此可以通过ASCII输出在程序之间传递一个数字,而不会损失精度。

我的问题

是否有可移植的方式将real输出到完全精度?我特别要求双精度kind s,但如果有{{1}} - 独立的方式,我会优先考虑这个答案。据推测,人们可以使用“过度精确”的方法,但也可以使用简洁的奖励积分。

2 个答案:

答案 0 :(得分:3)

通常情况下,如果十进制数字多于数据类型可以表示的十进制数字,则不会丢失任何位。因此,对于双精度IEEE浮点数,将为18位。

您的第二种格式使用了ifort支持但gfortran不支持的非标准语法。我不建议使用它。

Fortran 2018为实际值提供了“十六进制格式”,保留了所有位,但我认为只有C / C ++可以理解。

答案 1 :(得分:1)

您想要的格式是ES24.17