gpt4 book ai didi

formatting - 在 Fortran 中完全表达 double 值的可移植格式是什么?

转载 作者:行者123 更新时间:2023-12-02 11:50:13 24 4
gpt4 key购买 nike

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

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

默认的 ASCII 输出如下:

program main
use, intrinsic :: ISO_FORTRAN_ENV, only : dp=>REAL64, stdout=>OUTPUT_UNIT
implicit none

real(kind=dp), parameter :: pi = 3.141592653589793238462643383279502884197_dp

write(stdout,*) pi ! Test the default format
write(stdout,'(f)') pi ! Test the specific decimal default format
write(stdout,'(f20.15)') pi ! Probably sufficient precision...
write(stdout,'(f30.20)') pi ! EXCESSIVE PRECISION!

end program main

我了解不同的编译器可能有不同的格式默认值和要求。例如,ifort 编译上面的示例没有问题,并生成以下输出:

   3.14159265358979
3.1415926535897931
3.141592653589793
3.14159265358979311600
另一方面,

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

   3.1415926535897931

3.141592653589793
3.14159265358979311600

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

您会注意到结果有所不同。我预计没有一个结果是精确的,但精确到机器精度。当然,对于大多数用途来说,大约 15 位数字是可以接受的,但我对全精度输出很好奇,这样数字就可以通过 ASCII 输出在程序之间传递,而不会损失精度。

我的问题

是否有一种可移植的方式来输出完全精度的实数?我特别要求使用 double 实数,但如果有一种与kind无关的方法来做到这一点,我会优先考虑这个答案。据推测,人们可以使用“过度精确”的方法,但也可以为简洁加分。

最佳答案

通常情况下,如果您的十进制数字比数据类型可以表示的多三位,则不会丢失任何位。因此,对于 double IEEE float ,这将是 18 位数字。

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

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

关于formatting - 在 Fortran 中完全表达 double 值的可移植格式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50379032/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com