gpt4 book ai didi

math - 在不同计算机上使用不同编译器的 fortran 中一致的浮点运算?

转载 作者:行者123 更新时间:2023-12-04 17:37:43 25 4
gpt4 key购买 nike

如何使用不同的编译器和可能的不同计算机通过浮点运算获得相同的结果?

这是 p.f90

program fl
implicit none
real(kind=8) :: a

a=9d0/10d0
write(*,*) a

end program

使用 gfortran -o p p.f90 我得到 0.90000000000000002

使用 ifort -g -o p p.f90 我得到 0.900000000000000

有没有办法实现一致性?
小东西传播并变得更大。

最好的祝福
亚历山德罗

最佳答案

我们将在下面转向浮点运算,但让我首先处理您的一个误解。您在 write 语句中使用列表导向格式意味着编译器选择的写出变量的格式是编译器的选择;它不是由语言标准规定的。您使用第二个*write(*,*)告诉编译器根据需要写出变量的值。因此,您所拥有的并不是算术有问题的证据,而是gfortran 之间存在差异的证据。和 ifort .如果我将您的 write 语句修改为

write(*,'(f21.18)') a

然后我的英特尔 Fortran 程序写道
0.900000000000000022

到控制台。

SO充满了因不熟悉浮点运算的细节而引起的问题,所以我不打算写一篇论文,只是与你的问题相关的一些观察。

IEEE-754 64 位浮点数(这可能是您通过声明 real(kind=8) 得到的)仅提供大约 16 位十进制数字的有用信息。实际上,由于它们是二进制的,并且在一个基数和另一个基数之间没有简单的对应关系,它实际上是 15.95 个十进制数字,许多用户将其四舍五入,从不查看浮点数中第 15 个有效数字之后的任何内容-点数的十进制表示。所以 ifortgfortran用尾随 2 误导你s。

IEEE-754 不仅定义了 f-p 数的格式,还定义了一些舍入和算术运算的规则。精心编写的程序仅使用那些算术运算(我认为还指定了平方根)并考虑舍入模式和舍入操作应该在两个不同的处理器上产生相同的结果。当然,没有多少有用的数值程序只限于基本的算术运算。

自 2003 年标准 Fortran 包含一个名为 ieee_arithmetic 的内部模块以来这使程序员可以直接访问其运行的硬件的底层 IEEE-754 功能——但请注意,它并不要求硬件具有任何此类功能。使用 ieee_arithmetic和另一个名为 ieee_exceptions 的内在模块如果您的硬件提供了必要的支持,您应该能够编写在 gfortran 下编译的程序。和 ifort并且在执行时对每个 f-p 数的最后一位产生相同的结果。

您还需要熟悉您正在使用的编译器的优化选项和数值算术选项。大多数编译器都有一个选项,其含义是 sacrifice IEEE compliance for speed (对于 ifort 我认为是 fp-model )。一般来说,遵守 IEEE-754 的操作会减慢您的程序。

关于math - 在不同计算机上使用不同编译器的 fortran 中一致的浮点运算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13135262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com