【问题标题】:fortran compiler 4 vs 11fortran 编译器 4 与 11
【发布时间】:2011-03-19 00:58:14
【问题描述】:

我正在将应用程序从 fortran 旧版本 (4.0) 移植到新版本 (11.0)。在移植时,我遇到了一些 real*4 变量的问题:

real*4 a,b,c

a=0.9876875
b=0.6754345

c=a*b

旧编译器0.667118 中c 的值,这是正确的值。但是使用新的编译器,我从输出(c 变量)中得到了一个小的变化,比如0.667120。虽然这是一个很小的变化,但我在其他一些计算中使用了这些值。所以整体输出有很大的不同。如何克服这个问题?

【问题讨论】:

  • 你使用的是什么 Fortran 编译器?
  • 重申 Pillsy 的问题。 AFAIK Fortran 4 是 Fortran 66 之前的语言名称。我能找到的关于“Fotran 11”的最佳参考是来自 Abisoft 和 Intel 的特定编译器版本。你需要更具体。
  • 嗯。此外,CPU 是否与 x86 兼容(Intel/AMD PC)?这对浮点数产生了影响。
  • @T.E.D - 我想你的意思是 Absoft Pro Fortran,而不是 Abisoft。至于cvnravi,我认为他指的不是旧的fortran IV(很少写成“fortran 4”),而是编译器。
  • 如果你很在意精度,你可能应该使用real*8 而不是real*4。使用 PGI Fortran 和 GNU Fortran,我还使用了非 IEEE 兼容模式(GNU 称之为 -ffast-math,我忘记了 PGI 是如何称呼它的)将中间结果保存在 FPU 寄存器中,而不是将它们取出并四舍五入每个操作都解决了我遇到的一些问题。

标签: fortran


【解决方案1】:

我假设您正在从 Microsoft Fortran Powerstation 4 升级到 Intel 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 的表示取决于处理器和编译器,这就是您得到不同结果的原因之一。

【讨论】:

    【解决方案2】:

    在这里讨论英特尔视觉 Fortran 编译器版本 11 的变化:

    http://software.intel.com/en-us/forums/intel-visual-fortran-compiler-for-windows/topic/68587/

    结果是,旧版本的 Fortran 编译器会在执行操作之前将单精度值隐式提升为双精度值。版本 11 中的默认行为是以单精度执行操作。有一些编译器选项 (/arch:ia32) 可以在新编译器中启用旧行为。

    【讨论】:

      【解决方案3】:

      我假设您使用的是英特尔。尝试不优化编译..

      【讨论】:

        猜你喜欢
        • 2010-12-08
        • 2016-04-26
        • 1970-01-01
        • 2021-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-10
        相关资源
        最近更新 更多