5.1 ex0501.f90
代码:
program ex0501
implicit none
real (kind=4) :: a, b, res, h, temp, sum0
integer :: n, i
a = -2.0
b = 2.0
sum0 = 0.0
read(*,*) n
do i=1, n
h = (b-a)/n
temp = (a+i*h)**2+sin(a+i*h)
sum0 = sum0 + temp
end do
res = 0.5*h*(a**2+sin(a)+b**2+sin(b)+2*sum0)
write (*,*) 'The answer is',res
end
结果:
分析:
运行程序,选择n=10,100,100000等等,结果如图所示。可以看到,当n很小的时候不精确,n增大时结果越来越精确。但是当n继续增大的时候,由于变量里面使用的是单精度浮点数,造成运算过程中误差积累,又使结果变得不精确了。以上是个人的猜想,为了检查是否是精度的问题,把代码中的浮点数由单精度改为了双精度,再次运行程序所得结果如图二所示。这里把real (kind=4) :: a, b, res, h, temp, sum0 改为 real (kind=8) :: a, b, res, h, temp, sum0
综上所述,该实验成功的算出了积分,并且验证了了不同的精度对实验结果的影响。n太小时实验精度不够,n太大时由于本身使用的单精度浮点数,这样的精度累计起来的误差也要考虑在内。因此,选择一个合适的精度和n的值是很重要的。
网友评论