我使用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中变量的类型/种类。
答案 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
在我的机器上。