【发布时间】:2019-11-18 23:35:59
【问题描述】:
我一直在研究需要在 Windows 和 Linux 上运行的混合 C++/Fortran 数字代码,并追踪到 LOG10 函数的差异。我在 Linux 上使用 gcc/gfortran,在 Windows 上使用 MinGW。
这是一个例子:
PROGRAM FP
REAL VAL1, VAL2, ARG
DATA VAR1 / 12.5663710 /
DATA VAR2 / 10.6640625 /
DATA VAR3 / 1.08791232 /
ARG = VAR1 * VAR2 / VAR3
VAL1 = LOG10 (VAR1 * VAR2 / VAR3)
VAL2 = LOG10 (ARG)
WRITE (*,"(F30.25)") ARG
WRITE (*,"(F30.25)") LOG10(ARG)
WRITE (*,"(F30.25)") VAL1
WRITE (*,"(F30.25)") VAL2
END PROGRAM FP
在 Linux 上,我得到:
123.1795578002929687500000000
2.0905385017395019531250000
2.0905385017395019531250000
2.0905385017395019531250000
在 Windows 上,我得到了
123.1795578002929687500000000
2.0905387401580810546875000
2.0905387401580810546875000
2.0905387401580810546875000
相同的值将进入 LOG10,但 2.09053850 在 Linux 上出现,2.09053874 在 Windows 上出现。这足以导致测试出现实质性问题。如何在两个平台上获得相同的答案?
我正在使用其他人的 Fortran 代码,并且不是其浮点实现细节方面的专家,但通过并排跟踪代码直到值出现分歧,我发现了问题。 LOG10 似乎是罪魁祸首。
至于编译器版本,我在 Linux 上得到:
$ gfortran --version
GNU Fortran (Ubuntu 9.2.1-9ubuntu2) 9.2.1 20191008
在 Windows 上:
> gfortran --version
GNU Fortran (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 8.1.0
【问题讨论】:
-
可能是由于不同的默认线程状态。不是同一个问题,但相关:stackoverflow.com/q/46028336/126995
标签: fortran precision gfortran