Fortran IBMXLF编译器的双精度

Fortran IBMXLF编译器的双精度,fortran,precision,Fortran,Precision,我试图将一个程序从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 0.200000000000000011 在AIX上,我得到输出: 0.200000000000000 0.20000000000

我试图将一个程序从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
0.200000000000000011
在AIX上,我得到输出:

0.200000000000000
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版

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

print '(f24.20)',0.2d0

这将向您显示
ifort
的末尾也有一个。在我的计算机上,它打印
0.200000000001110

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

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


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

请参阅我对该问题的回答的第一段--