双精度后D0的也会引起误差(D0重要性)
双精度后D0的也会引起误差(D0重要性)
点击浏览该文件
在大型复杂工程应用程序中,有大量变量需要赋值,很多人很随意的赋值。甚者说“双精度变量只要声明了,赋值有没有d0不会影响计算结果!”。对一些计算精度要求不高的,没什么大的问题,但对于一些计算精度要求高的,这时如果不引起注意,可能会出现计算结果不对。例如下面一段FORTRAN程序,本来程序中两个数组定义一致,赋值大小也一致,但由于赋值时d0 (f赋值缺少d0,f1有d0)存在与否会引起误差(图)。
高手指点为什么?
program test_real8_d0
implicit none
real(8),dimension(5) ::f,f1,ferror
integer ::i
open(6,file='dat.d11')
!f
f(1)=0.1
f(2)=0.2
f(3)=0.1
f(4)=0.3
f(5)=0.2
!f1
f1(1)=0.1d0
f1(2)=0.2d0
f1(3)=0.1d0
f1(4)=0.3d0
f1(5)=0.2d0
do i=1,5
ferror(i)=f1(i)-f(i)
write(6,*) i, ferror(i)
enddo
stop
end program test_real8_d0
图 双精度中缺少D0引起的误差
点击浏览该文件
在大型复杂工程应用程序中,有大量变量需要赋值,很多人很随意的赋值。甚者说“双精度变量只要声明了,赋值有没有d0不会影响计算结果!”。对一些计算精度要求不高的,没什么大的问题,但对于一些计算精度要求高的,这时如果不引起注意,可能会出现计算结果不对。例如下面一段FORTRAN程序,本来程序中两个数组定义一致,赋值大小也一致,但由于赋值时d0 (f赋值缺少d0,f1有d0)存在与否会引起误差(图)。
高手指点为什么?
program test_real8_d0
implicit none
real(8),dimension(5) ::f,f1,ferror
integer ::i
open(6,file='dat.d11')
!f
f(1)=0.1
f(2)=0.2
f(3)=0.1
f(4)=0.3
f(5)=0.2
!f1
f1(1)=0.1d0
f1(2)=0.2d0
f1(3)=0.1d0
f1(4)=0.3d0
f1(5)=0.2d0
do i=1,5
ferror(i)=f1(i)-f(i)
write(6,*) i, ferror(i)
enddo
stop
end program test_real8_d0
图 双精度中缺少D0引起的误差
[此贴子已经被作者于2012-1-17 19:14:11编辑过]