Fortran 高精度定义

http://epsilong.blog.163.com/blog/static/8569511820095143752176/

2009-06-14 15:07:52|  分类: 程序编程 |举报 |字号 订阅

Fortran跟C一样,也分整型(INTEGER),实型(REAL),双精度(REAL*8或REAL(8)或DOUBLE
PRECISION),这些在科学计算中还是比较重要的,以实型数为例:
一般REAL等价于REAL*4或REAL(4),是单精度的;
而双精度在F77中表示为DOUBLE PRECISION,在F90中可以表示为REAL*8或REAL(8),在高精
度计算中,双精度的变量是很有必要的,对于一般实数可以表示为小数形式或指数形式,
而双精度都表示成指数形式,但指数E要改成D,如:
REAL:100.0或1e2,双精度下就得表示成1D2
由于Fortran中不需要对每个变量都进行声明,所以有时候会在每个程序或子程序开头做个
说明,如下:
IMPLICIT DOUBLE PRECISION(A-H,O-Z)
代表以A-H以及O-Z字母开头的变量默认(在不声明的情况下)是双精度的,否则则是整型
的,如下:
******************************************************************************
PROGRAM D
IMPLICIT DOUBLE PRECISION(A-H,O-Z)
J1=1D-2
J2=-0.5D-1
x=J1+J2
print *,x
end
******************************************************************************
PROGRAM E
implicit double precision (A-I,O-Z)
double precision a,i,e1,e2
data j2 /0.87450547081842D-3/
data j3 /-0.11886910646016D-4/
data j5 /-0.17242068505339D-5/
data j7 /0.10566966079622D-6/
write(*,*) "please input a"
read(*,*) a
write(*,*) "please input i"
read(*,*) i
e1=(j3*sin(i)/(2*a*j2)-5*j5*sin(i)*(1-7*sin(i)**2/2+21*sin(i)**4/8)&
&/(2*a**3*(2-5*sin(i)**2/2))+35*j7*sin(i)*(1-27*sin(i)**2/4+99&
&*sin(i)**4/8-429*sin(i)**6/64)/(3*a**5*(2-5*sin(i)**2/2)))
e2=-(j3*sin(i)/(2*a*j2)-5*j5*sin(i)*(1-7*sin(i)**2/2+21*sin(i)**4/8)&
&/(2*a**3*(2-5*sin(i)**2/2))+35*j7*sin(i)*(1-27*sin(i)**2/4+99&
&*sin(i)**4/8-429*sin(i)**6/64)/(3*a**5*(2-5*sin(i)**2/2)))
write(*,"(E9.2E3)") e1,e2
stop
end
******************************************************************************
第一个程序输出不是-0.4而是0.000000000000000E+000
第二个程序任意输入a、i,并未得到希望得到的结果,而是输出NAN和NAN,关于NAN这个错
误,有时候函数定义域不符合的时候,运行并不报错而是输出NAN,这个时候检查程序这些
地方是检查的重点,当然,会有其他情况,但我碰到的不多,只好就我所知跟大家交流一
下。
这两个程序都因为J开头的变量不属于默认双精度变量,而用双精度表示给它们赋值了,导
致结果跟预期不一致,在程序中把这些以J开头的变量用REAL*8声明一下,或把
implicit double precision (A-I,O-Z)改为:
implicit double precision (A-J,O-Z),或把这个语句去掉
就可以得到预期的结果了。
对于数组,可以用DIMENSION定义,但需要注意的是,若在程序头未做声明(implicit
none)时,用DIMENSION定义数组时,当数组名首字母不属于(A-J,O-Z)里时,其值输出时
为整型,当然做了如下声明情况也会如此:(implicit double precision (A-I,O-Z))
如下:
******************************************************************************
PROGRAM F
dimension m(2)
m(1)=1.5
m(2)=2.5
print *,m(1),m(2)
end
******************************************************************************
输出的结果是“1,2”而不是“1.500000,2.500000”
当把程序中m改为a时,输出“1.500000,2.500000”
所以,比较好的方法是尝试用REAL来定义数组(当然也可以用REAL*8):
******************************************************************************
PROGRAM G
real m(2)
m(1)=1.5
m(2)=2.5
print *,m(1),m(2)
end
******************************************************************************
另外,要说的是,变量可以不定义而直接赋值,但会出现如上面PROGRAM D-E的问题,所以
建议大家在编程的时候对非整型变量声明一下,尽管麻烦,但不容易出错,有时候正是这
类错误会让初学者困扰好久。
定义变量时,经常会看到两种定义的写法:以REAL为例:
可以有
real m
和 real:: m
第一种方式不可以直接赋值,必须写成这样:
******************************************************************************
PROGRAM H
real m
m=1.0
print *,m
end
******************************************************************************
第二种则可以:
******************************************************************************
PROGRAM I
real:: m=1.0
print *,m
end
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 差分格式是一种用于数值计算的数值方法,它在Fortran编程语言中被广泛应用。差分格式的基本思想是将连续函数的导数近似为有限差分商,从而将微分方程转化为差分方程。 在差分格式中,我们首先将函数的定义域离散化,将连续的函数变为离散的函数。然后,利用有限差分近似求解函数在离散点上的导数值。常见的差分格式有前向差分、后向差分和中心差分。 前向差分格式通过使用函数在当前点和当前点之后的值来计算导数的近似值。这种方法的好处是简单易实现,但精度一般较低。 后向差分格式与前向差分格式相反,使用函数在当前点和当前点之前的值来计算导数的近似值。这种方法通常具有更高的精度,但需要更多的计算量。 中心差分格式是差分格式中最常用的一种方法,它利用函数在当前点的邻近点值来计算导数的近似值。这种方法既兼具计算效率又能够提供较高的精度。 差分格式在数值计算中有广泛的应用,特别是在求解偏微分方程和优化问题时。通过灵活选择离散化方法和差分格式,我们能够在计算机上高效地计算复杂的数学模型。Fortran编程语言提供了强大的数值计算功能,可以方便地实现各种差分格式,从而有效地解决各种实际问题。 ### 回答2: 差分格式是一种计算数学的方法,用于数值求解偏微分方程或差分方程。Fortran是一种广泛应用于科学计算的编程语言。因此,Fortran差分格式指的是使用Fortran编写差分格式的算法。 差分格式的基本思想是将连续的问题离散化,将连续的变量和导数转化为有限差分,然后通过计算离散点上的数值来近似求解连续问题。离散化可以通过网格点的选择和离散间距进行控制。常见的差分格式包括中心差分、前向差分和后向差分等。 Fortran作为一种高性能的科学计算语言,具有优秀的数值计算能力和数组操作特性,非常适合编写差分格式的算法。通过Fortran编写差分格式的算法,可以利用其高效的数值计算能力和丰富的数值计算函数库,提高计算效率和精度。 在Fortran中,我们可以定义数组来存储离散点上的数值,利用循环结构计算差分点的近似值,并利用索引操作和数组函数来进行数值计算。同时,Fortran还提供了丰富的输入输出函数,使得我们可以方便地输入初始条件和输出求解结果。 总结来说,Fortran差分格式是一种使用Fortran编写差分格式的算法,通过将连续的问题离散化,利用离散点上的数值近似求解连续问题。Fortran作为一种高性能的科学计算语言,使得我们可以编写高效、精确的差分格式算法。 ### 回答3: Fortran差分格式是一种数值计算方法,用于近似求解微分方程。它主要用于解决偏微分方程的初值问题,通过将连续的微分方程离散化为一系列差分方程,从而得到数值解。 差分格式可以分为显式和隐式两种类型。显式差分格式在求解差分方程时,使用当前时间步的已知值来计算下一个时间步的未知值。这种方法简单易实现,但对于稳定性和精确性要求较高的问题可能会出现数值不稳定或误差过大的情况。 隐式差分格式则是使用下一个时间步的未知值来计算当前时间步的未知值。这种方法相比显式差分格式更为稳定,但计算量较大,需要通过迭代等方法求解线性方程组。 具体而言,Fortran差分格式可以采用中心差分、向前差分或向后差分等方式来近似微分方程中的导数。在离散化过程中,将所求的函数用网格中的点来表示,通过将微分方程中的导数用差分表示,将微分方程转化为差分方程。通过已知的初值条件和边界条件,再通过迭代计算,逐步逼近微分方程的数值解。 总结来说,Fortran差分格式是一种常用的数值计算方法,通过离散化微分方程,用差分方程逼近微分方程的解。它在科学和工程计算中应用广泛,可以有效解决复杂的数学模型和实际问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值