为什么Python和Fortran77为这个分数返回不同的值



长话短说,我正试图用Python重写我的顾问发给我的Fortran77代码,因为Python对我来说更方便。当我测试我的代码时,我意识到我的输出与Fortran代码略有不同。这一切似乎都源于Fortran中的一些舍入错误或诸如此类的东西。

例如,Python中的分数277./14336.返回:

print(277./14336.)
> 0.019321986607142856
^

但在Fortran77我得到:

program foo
implicit none
real*8 x
x=277./14336.
write(*,*) x
end program
> 1.9321987405419350E-002
^

所以这些数字等于第8个有效数字,一般来说应该足够好。但是,当我试图评估数值精度时,我的代码有一些微调的抵消(精确到10^8中的1部分(,因此Fortran的误差估计有时是Python代码的两倍。

发生了什么事?首先我认为这是因为Fortran是用32位运行的,而Python是用64位运行的。但当我运行32位版本的Python时,我得到了同样的结果(尽管我不确定它有什么不同,因为我仍然使用64位操作系统(,我读到Fortran中的real*8意味着8字节精度,即64位。Python和Fortran中浮点数的表示有根本区别吗?

Python的答案更准确。

在Fortran中,您将结果分配给64位浮点,但输入是32位浮点。因此,除法是在32位模式下进行的,然后在赋值中将结果扩展到64位。

在计算中使用64位浮点,您应该会得到正确的结果。

$ cat div.f90
Program div
Use, Intrinsic :: iso_fortran_env, Only :  wp => real64
Implicit None
Real( wp ) :: x
x = 277.0_wp / 14336.0_wp
Write( *, * ) x
End Program div
$ gfortran -Wall -Wextra -std=f2008 -fcheck=all div.f90 
$ ./a.out
1.9321986607142856E-002

相关内容

  • 没有找到相关文章

最新更新