【问题标题】:Fortran improper output on AIX and LinuxAIX 和 Linux 上的 Fortran 输出不正确
【发布时间】:2013-10-14 01:39:49
【问题描述】:

我有一个场景,我声明一个变量 real*8 并读取一个值

0.1234123412341234

存储在文件中。

当我尝试在 Linux 上将其读取到变量并显示该值时,它会打印

0.12341234123412

而当我为 AIX 运行相同的代码时,它会打印值

0.12341234123412370

为什么两个平台会为相同的代码打印不同的值?不使用格式说明符有没有可能克服这个问题?

附言

AIX 编译器是 xlf

Linux 编译器是 ifort

【问题讨论】:

    标签: linux fortran precision aix intel-fortran


    【解决方案1】:

    我假设您使用的是列表导向的 IO,write (X, *)。虽然这种类型的 IO 很方便,但标准并未完全指定输出。如果您希望您的输出在编译器和平台之间非常相似,您应该使用一种格式。 (由于使用了有限精度算术,您的结果可能仍然存在细微差异。)

    【讨论】:

    • 我了解使用该格式有助于保持值的一致性。但是我有一个程序有多个写语句,所以你认为有可能在编译时指定吗?或者有什么办法可以克服这个问题,而不是像使用编译器选项这样改变实际代码?
    • 我从未见过用于控制列表导向 IO 行为的编译器选项。如果要控制IO,则需要使用格式。您可以使用带标签的格式语句并在许多写入语句之间共享它......这样,如果您希望更改输出,则只有一种格式需要更新。
    【解决方案2】:

    你不应该使用REAL*8来声明双变量,你应该使用

    INTEGER, PARAMETER :: prec = SELECTED_REAL_KIND(15,307)
    REAL(prec) :: variable
    

    指定一个可移植的双精度变量(see here 了解更多详情)。

    无论如何,您遇到的问题与precision 有关。双精度变量在出错之前可以达到 15 位,这似乎是两种编译器的情况。事实上,我认为这些确实是相同的数字,因为它们非常接近(大约 3E-12 的百分比差异)。

    【讨论】:

    • 我同意两个编译器显示的值是相同的,因为差异很小,但我遇到的问题是我希望 linux 输出显示与 AIX 相同的输出。我正在处理一个每个十进制数字都很重要的程序。所以我试图让linux等于AIX,因为AIX更准确。你有什么建议吗?
    • 如果小数点后第 15 位精度计算在内,则转到四倍精度,不必担心小数点后第 16 位及以后。我也不会说“AIX 更准确”,因为您正在比较数字的唯一到 15 位准确表示的第 16 位。
    猜你喜欢
    • 1970-01-01
    • 2011-04-23
    • 2017-12-27
    • 2012-04-30
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    相关资源
    最近更新 更多