Fortran运算
混合运算
在进行一个实例计算时,常常会遇到混合运算的情况,即计算中的数字类型不完全相同。因此,在进行混合运算时,最好先将数据进行类型的转换工作,把数据类型统一起来。
可通过以下实例,计算数学常数e,来更加深刻的体会数据类型的重要性。
在该过程中我遇到的问题:
- 数据类型 。整数类型是无法记录小数的,因此,两个整数计算除法之前,都要将整数利用real()转换成浮点数,否则1/2=0。当除数与被除数的类型不同,计算的结果会以浮点数来表示。不过,最好还是转换成相同类型的数据进行计算。同时为了得到正确的数据,请再移步格式化输入输出。
- 定义数据精度 。计算精度差异也会导致计算结果的差异(如下所示)
program test
implicit none
integer(kind=4) :: n
real(kind=8) :: n1,e1,e2
read(*,*) n
e1 = (1+1.0/n)**n
n1 = 1.0/real(n)
e2 = (1+n1)**n
write(*,*) 'e1,e2=',e1,e2
end
取n=9999999时,结果:e1,e2= 3.2929794788360596 2.7182816454726098
计算结果的差异是因为计算机在保存浮点数时,会先把它转成科学计数法,其中数值部分可以保留的部分约6位数字(单精度浮点数的有效位数为6位),所以1234567,实际上表示为1.23456* 10^{7} ,最后两个数字会被忽略,想要解决这个误差,可以通过改用双精度声明变量,双精度有效位数为15位。
program test2
implicit none
integer(kind=4) :: n
real(kind=8) :: n1,n2
read(*,*) n
n1 = 1.0/n