精度不受尊重

时间:2015-06-14 08:17:28

标签: visual-studio-2010 fortran

我使用Visual Studio(2010 SP1)和Fortran IMSL(2011),我无法获得正确的精度:

program prova

use, intrinsic :: iso_fortran_env

implicit none

integer, parameter :: ikind=selected_real_kind(p=8, r=99)
real(kind=ikind) ::      a=0.79
real(real64) ::          b=0.79
real(kind=16) ::         c=0.79
real(8) ::               d=0.79

print *, a
print *, b
print *, c
print *, d

end program prova

给我相同的结果:0.790000021457672(一个精度更高,一个精度更低,但每个数字与指定的数字不同:0.79)

为什么我的意愿不受尊重?

如何将所有实数设置为所需的精度?

注意:我的问题与“计算机的有限性”,舍入数字和类似情况无关。我的问题是关于Fortran中变量的类型/种类。

1 个答案:

答案 0 :(得分:1)

您要将变量设置为具有所需的精度,但随后使用默认精度分配常量。试试:

program prova

use, intrinsic :: iso_fortran_env

implicit none

integer, parameter :: ikind=selected_real_kind(p=8, r=99)
real(kind=ikind) ::      a=0.79_ikind
real(real64) ::          b=0.79_real64
real(kind=16) ::         c=0.79_16
real(8) ::               d=0.79_8

print *, a
print *, b
print *, c
print *, d

end program prova

这将以正确的精度设置常量,但由于您只提供两位有效数字,结果仍将四舍五入到最接近的可表示浮点数(在基数2中)。 0.79可以在十进制系统(基数10)中精确表示,但不能在基数2中表示。因此偏差。您应该阅读Wikipedia Artical on Floating-Point Numbers,当然还有What Every Computer Scientist Should Know About Floating-Point Arithmetic

这导致

  0.79000000000000004     
  0.79000000000000004     
  0.790000000000000000000000000000000031      
  0.79000000000000004   

在我的机器上。