我正在将一个应用程序从fortran旧版本(4.0)移植到新版本(11.0)。在移植过程中,我遇到了一些实数*4变量的问题:
real*4 a,b,c
a=0.9876875
b=0.6754345
c=a*b旧编译器0.667118中c的值,这是正确的值。但是使用新的编译器,我得到了输出(c变量)的一个小变化,比如0.667120。虽然这是一个很小的变化,但我在其他一些计算中使用了这些值。因此,总体产出有很大的不同。如何克服这个问题?
发布于 2009-10-06 14:24:26
我猜,您是要从Microsoft Fortran Powerstation 4升级到英特尔Visual Fortran 11.xx吗?
不管怎样,试试这个:
program test32
integer, parameter :: iwp = selected_real_kind(15,300)
real(iwp) :: a,b,c
a=0.9876875
b=0.6754345
c=a*b
write(*,'(3f12.8)')a,b,c
end program test32这给出了:
0.98768753 0.67543453 0.66711826我不会解释selected_real_kind,这并不是因为我不希望,而是因为帮助可能会做得更好。但是,如果这里有什么不清楚的地方,一定要问一问。
附注:real*4或任何类型的real的表示都依赖于处理器和编译器,这也是你得到不同结果的原因之一。
发布于 2009-10-06 17:06:16
此处讨论英特尔visual Fortran编译器版本11的变化:
http://software.intel.com/en-us/forums/intel-visual-fortran-compiler-for-windows/topic/68587/
结果是,旧版本的Fortran编译器会在执行操作之前隐式地将单精度值提升为双精度值。版本11中的默认行为是以单精度执行操作。有一些编译器选项(/arch:ia32)可以在新编译器中启用旧的行为。
发布于 2009-10-06 14:17:10
我假设你用的是英特尔。尝试在不优化的情况下编译..
https://stackoverflow.com/questions/1525493
复制相似问题