1

我正在尝试将程序从 Red Hat Linux 移植到 IBM AIX,但 IBM 系统的精度似乎与 Red Hat 系统不同。有谁知道为什么会这样?这是一个例子:

program main
implicit none
real(8) a
a=0.2D0
print *,a
end program

在 Red Hat 上,我得到输出:

0.200000000000000

在 AIX 上,我得到输出:

0.200000000000000011

我正在使用的系统版本:

IBM XL Fortran for AIX,V13.1 (5724-X15) 版本:13.01.0000.0005

Linux 2.6.18-8.el5 x86_64

ifort 版本 10.0

4

2 回答 2

1

这可能只是默认打印位数的差异。0.2不能准确地表示为二进制浮点数,所以你总是会在最低有效位上有一些垃圾。为浮点数打印的默认位数ifort只是设置为足够低,以至于在这种情况下您看不到它。实际计算(很可能)具有相同的精度。用两个编译器试试这个:

print '(f24.20)',0.2d0

这将向您显示ifort最后也有这些。在我的电脑上,它打印0.20000000000000001110.

于 2012-11-02T21:56:21.920 回答
1

print 语句中的 * 表示列表定向格式。对于实常数,使用位数的“合理的处理器相关值”(F2008 10.10.4 p6)。您已经更改了 Fortran 处理器,而这些处理器只是选择了不同数量的数字作为合理的数字。

如果要显式控制输出格式,请使用指定字段宽度、十进制位数和(可能)指数字符数的显式输出格式。这消除了处理器依赖性。

两个处理器的变量的内存精度可能相同(假设 KIND(1.0D0) == 8 并且 KIND 为 8 表示 IEEE 双精度),请注意 0.2 在该浮点表示中不能完全表示。

于 2012-11-02T22:08:12.023 回答