假设我希望以可移植的方式将双精度值写入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}} - 独立的方式,我会优先考虑这个答案。据推测,人们可以使用“过度精确”的方法,但也可以使用简洁的奖励积分。
答案 0 :(得分:3)
通常情况下,如果十进制数字多于数据类型可以表示的十进制数字,则不会丢失任何位。因此,对于双精度IEEE浮点数,将为18位。
您的第二种格式使用了ifort支持但gfortran不支持的非标准语法。我不建议使用它。
Fortran 2018为实际值提供了“十六进制格式”,保留了所有位,但我认为只有C / C ++可以理解。
答案 1 :(得分:1)
您想要的格式是ES24.17