Fortran程序设计第14章固有过程.docx
- 文档编号:22805364
- 上传时间:2023-04-28
- 格式:DOCX
- 页数:23
- 大小:38.78KB
Fortran程序设计第14章固有过程.docx
《Fortran程序设计第14章固有过程.docx》由会员分享,可在线阅读,更多相关《Fortran程序设计第14章固有过程.docx(23页珍藏版)》请在冰豆网上搜索。
Fortran程序设计第14章固有过程
第14章 固有过程
固然,我们已经能够做到运用FORTRAN95来描述任何的计算任务,因为FORTRAN95所提供的数据类型,固有运算,派生类型,自定义运算,以及构造函数与子例行程序的方法,都足以使得我们应付任何的计算问题。
不过FORTRAN95标准还提供了大量的科学计算的常规计算与函数,都可以作为固有过程直接使用,而不需要我们自己来编写源码。
这就好像对于一个汽车装配师,除了给他提供螺栓,轴承之类的标准零件,还给他提供更高层次的标准配件,例如各种型号的发动机,电机之类。
因此熟练掌握固有过程,将给我们带来如虎添翼的感觉。
FORTRAN95把固有过程作为标准来提出,就意味着任何的FORTRAN95的编译器实现版本,都必须能够提供它们:
115个固有过程,其中包括109个固有函数和6个固有子例行程序。
当然不排除很多的编译器还提供额外的固有过程。
正是由于固有过程是属于FORTRAN95的标准内容,因此和固有运算,例如+,一样,总是“随叫随到”,无论在哪个程序单位内部,只要使用某个固有过程的名称,就等于调用了该固有过程。
不过,如果它的名称被用户定义的函数或子例行程序所“侵占”,那么在下面的情况下,被调用的将是用户自定义的函数或子例行程序而不是固有过程:
● 该自定义函数或子例行程序的界面是显式的;
● 该自定义函数或子例行程序出现在EXTERNAL语句当中;
● 该自定义函数属于语句函数。
当然上述的名称被侵权的有效范围只是该自定义函数或子例行程序的作用域。
相应的,固有过程也就只能在下面的情形下夺回被侵占的名称:
● 不存在使用该名称的语句函数;
● 它的名称出现在INTRINSIC语句当中;
● 相应的用户定义的过程的界面是隐式的。
例如在一个模块或一个内部过程里面,由于它的界面是显式的,那么固有过程的名称就能够被侵占,除非固有过程的名称出现在一个有效的INTRINSIC语句当中。
下面我们主要讨论固有过程的按照功能的分类,以及每个种类的固有过程所能够完成的计算任务。
FORTRAN95的固有过程主要分为如下5类:
● 查询与数字操作函数;
● 转换,置空以及传递函数;
● 计算函数;
● 数组函数;
● 固有子例行程序。
在分别讨论上面5种固有过程之前,我们首先讨论13章所没有仔细讨论的固有过程的一些特点。
14.1 固有过程的分类与性质
固有过程可以从形式和功能两个方面来进行分类。
从形式的角度来看,固有过程分为如下两类:
● 类过程;
● 种过程。
所谓类过程是一个集合名称,类过程与种过程是一个集合与其元素的关系。
一个类过程由两个或多个种过程组成。
在固有过程中间之所以会出现这种关系,是因为过程所具体针对的变元的作为数据对象的类型与种别,是具有不同分类的,这样就导致同一个函数,当它的变元取不同类型或种别的数据值时,就需要对固有过程按照情形进行分类,甚至采用不同的过程名称,来应对相应的变元情况。
例如同样是求一个变量的绝对值,当该变量分别取实型和复型数值时,就对应了完全不同的计算过程,因此有必要给予不同的函数名称,尽管在数学的意义上,都是成为取绝对值。
在所有的115个固有过程当中,除了如下4个固有函数外,其他都是类过程:
● LGE;
● LGT;
● LLE;
● LLT。
对于每个类过程属下的种过程,显然都必定具有相应的类型,种别,甚至秩的属性。
许多的种过程具有专门的过程名称,在下面的表14-1当中列出了它们的全部名称以及相应的变元属性。
这些种过程的名称也可以直接用作过程引用,但并不提倡。
这些名称的主要用途是作为实元来传递,这时就必须使用种过程名称。
注意,在表中注明了少数种过程不能作为实元。
如果从功能的角度来对固有过程分类,那么除了上面的比较具体的5类之外,还可以从固有过程对数组的作用方式的角度,把固有过程分为两大类:
逐元过程和变换过程。
● 逐元过程
从数学的观点来看,这种过程的计算对象并不是数组,但是可以运用一种自然的方式使得这种过程能够作用于数组对象,并且得到相同形状的数组结果。
也就是使得该过程分别作用于数组的每个元素,把所有的过程结果再集合起来作为结果数组。
固有过程当中的大部分都属于逐元过程,包括:
● 转换函数;
● 计算函数(除了REPEAT,TRIM,DOT_PRODUCT,MATMUL之外);
● 子例行程序MVBITS。
其他的所有固有过程就都不是逐元过程了。
● 变换过程
固有过程里面逐元过程之外的所有过程都称为变换过程,因为从它们的定义的实质上看,就是作用于一个数组数据对象,得到一个标量或者数组结果,也就是一个变换的过程,而不是单独地作用于每个元素。
因此除了函数NULL之外,所有的变换过程或者是具有一个取数组值的哑元,或者是具有一个取数组值的实元,它们对数组的作用都是某种整体变换作用。
例如对于向量的乘积,就不能逐个元素地进行。
固有过程的引用正如一般过程的引用一样,可以使用关键词变元。
由于某些固有过程的变元是可选项,因此使用关键词能够省略相应的实元。
关键词变元也就是固有过程的哑元名称,在少数情况下,同一个名称会出现在不同的固有过程,不过这些名称基本上表示了相似的功能,因此不会带来什么实质问题。
这几个名称列举如下。
●DIM;
DIM主要用于数组简化函数以及其他一些数组函数,表示在函数的作用对象不是整个数组的情况下,数组的哪个维度被过程作用。
DIM取值为标量整型值,并且常常是可选变元。
● MASK;
MASK总是表示一种过滤器的作用,即把数组里面与过程作用无关的元素过滤掉,以免耗费资源。
MASK的是通过一个与被过滤数组相同形状的逻辑型数组来行使过滤功能的。
一般MASK为可选变元。
● KIND;
KIND一般用于转换函数,说明转换结果的种别参数。
KIND实元必须是一个标量整型初始化表达式,一般是可选的。
● BACK。
BACK作为一个可选的逻辑型变元用来表示逆序过程,即它所出现的固有过程的对于数据对象的反方向操作。
例如如果在固有过程INDEX当中出现了BACK=.TRUE.,那么INDEX的搜索操作就必须与正常方向相反,即从字符串的右端开始。
注意固有函数的非指针哑元都具有INTENT(IN)的属性,而指针哑元则不能改变其关联的实元或目标。
表14-1 种过程的过程名称以及相应的变元属性
类过程名称
种过程名称及其变元
种过程变元类型
ABS
ABS(A)
CABS(A)
DABS(A)
IABS(A)
默认实型
默认复型
双精度实型
默认整型
ACOS
ACOS(X)
DACOS(X)
默认实型
双精度实型
AIMAG
AIMAG(Z)
默认复型
AINT
AINT(A)
DINT(A)
默认实型
双精度实型
ANINT
ANINT(A)
DNINT(A)
默认实型
双精度实型
ASIN
ASIN(X)
DSIN(X)
默认实型
双精度实型
ATAN
ATAN(A)
DTAN(A)
默认实型
双精度实型
ATAN2
ATAN2(A)
DTAN2(A)
默认实型
双精度实型
CHAR
*CHAR(I)
默认整型
COS
COS(X)
CCOS(X)
DCOS(X)
默认实型
默认复型
双精度实型
CONJG
CONJG(X)
默认复型
COSH
COSH(X)
DCOSH(X)
默认实型
双精度实型
DIM
DIM(X,Y)
IDIM(X,Y)
默认实型
默认整型
DPROD
DPROD(X,Y)
默认实型
EXP
EXP(X)
CEXP(X)
DEXP(X)
默认实型
默认复型
双精度实型
ICHAR
*ICHAR(C)
默认字符型
INDEX
INDEX(STRING,SUBSTRING)
默认字符型
INT
*INT(A)
*IFIX(A)
*IDINT(A)
默认实型
默认实型
双精度实型
LEN
LEN(STRING)
默认字符型
LGE
*LGE(STRING_A,STRING_B)
默认字符型
LGT
*LGT(STRING_A,STRING_B)
默认字符型
LLE
*LLE(STRING_A,STRING_B)
默认字符型
LLT
*LLT(STRING_A,STRING_B)
默认字符型
LOG
ALOG(X)
CLOG(X)
DLOG(X)
默认实型
默认复型
双精度实型
LOG10
ALOG10(X)
DLOG10(X)
默认实型
双精度实型
MAX
注1
注2
*MAX0(A1,A2,A3,…)
*AMAX1(A1,A2,A3,…)
*DMAX1(A1,A2,A3,…)
*MAX1(A1,A2,A3,…)
*AMAX0(A1,A2,A3,…)
默认整型
默认实型
双精度实型
默认实型
默认整型
MIN
注1
注2
*MIN0(A1,A2,A3,…)
*AMIN1(A1,A2,A3,…)
*DMIN1(A1,A2,A3,…)
*MIN1(A1,A2,A3,…)
*AMIN0(A1,A2,A3,…)
默认整型
默认实型
双精度实型
默认实型
默认整型
MOD
MOD(A,P)
AMOD(A,P)
DMOD(A,P)
默认整型
默认实型
双精度实型
NINT
NINT(A)
IDNINT(A)
默认实型
双精度实型
REAL
*REAL(A)
*FLOAT(A)
*SNGL(A)
默认整型
默认整型
双精度实型
SIGN
SIGN(A,B)
DSIGN(A,B)
ISIGN(A,B)
默认实型
双精度实型
默认整型
SIN
SIN(X)
CSIN(X)
DSIN(X)
默认实型
默认复型
双精度实型
SINH
SINH(X)
DSINH(X)
默认实型
双精度实型
SQRT
SQRT(X)
CSQRT(X)
SDQRT(X)
默认实型
默认复型
双精度实型
TAN
TAN(X)
DTAN(X)
默认实型
双精度实型
TANH
TANH(X)
DTANH(X)
默认实型
双精度实型
注1:
该函数没有相应的类过程名称,它的结果为默认整型。
注2:
该函数没有相应的类过程名称,它的结果为默认实型。
注3:
标注星号*的函数不能用作实元。
注4:
某些种过程名称与其类过程名称一样。
14.2 数据的表示模式
一些固有函数的计算结果是与数据的表示模式有关的,因此在这里我们首先给出数据的3种表示模式。
一个数据值的表示模式,决定了它的存储空间以及表示精度,包括如下3种模式:
● 位模式;
● 整数模式;
● 实数模式。
有关数值的表示模式的信息对于很多的计算都是非常重要的,因为计算机的数据表示的离散性本质,使得我们不能期望很多的数学计算能够在计算机上面具有通常的行为,例如级数的收敛问题涉及到几乎所有的微积分数值计算,由于实数在计算机里面并不是可以无限位地表示,所以必须知道某个具体的系统所能够达到的精度,才能够判断相应的计算能够做到什么程度。
所谓位模式就是把一个整型标量非负的数据对象B表示为一个2进制的数字序列:
,
其中的每个数字取0或1。
把这样一个数字序列转换为10进制数值,采用如下的公式:
。
所谓整数模式的数值表示形式是一个任意进制的数字序列,但可以具有正负号,不能带有小数点,转换为19进制的公式为:
其中:
● s为+1或-1;
● r为大于1的整数;
●
为整数并且
。
所谓实数模式采用如下的公式:
,
其中:
● s为+1或-1;
● r为大于1的整数;
● n为尾数部分数字的数目,是一个大于1的整数;
●
为整数并且
;
● e是某个最大值与最小值之间的整数,表示某种实现所能够表示的数值范围。
实数的一般实现方式是按照IEEE2进制浮点标准,在单精度模式时,取:
r=2
n=24
这样一个实数的尾数部分包括符号一起就占据了24位,而它的指数部分包括符号一起占据了8位,因此一个单精度实数表示要占据32位。
注意e不能取-126,-127,-128这些数值,因为还需要额外地表示溢出,0,以及NaNs,即非法值。
14.3 查询函数和数字操作函数
本节所讨论的函数并不是一般概念下对变元进行某种计算的函数,它的返回值是用来反映有关变元的状态与性质的各种信息。
所谓查询函数返回的是有关变元的数据类型的信息,因此返回值与变元的具体取值无关,而引用这种函数的实元也不需要预先定义。
所谓数字操作函数返回的是与实元取值相关的数值环境信息,因此引用这种函数的实元就需要给出定义。
根据所查询信息的不同种类,查询函数还可以分为7类,分别说明如下。
● 字符查询函数。
这类函数只包含一个固有函数LEN。
它返回作为字符串的变元的字符长度值。
该长度值是在变元数据类型声明里面给出的,因此变元不需要给出具体的取值,就能够使用该查询函数。
对于哑长度的哑元,LEN返回的是其实元的长度值。
● 位查询函数。
这类函数只包含一个固有函数BIT_SIZE。
如果一个整型标量数据对象采用了位模式的表示模式,那么使用该函数,就能够返回其变元的位模式表示公式里面的n的值。
其变元只需要是一个整数即可,不需要给出定义。
● 种别查询函数。
这类函数包含3个固有函数KIND,SELECTED_INT_KIND,和SELECTED_REAL_KIND。
这3个固有函数都返回变元的种别参数,而变元的具体取值都不需要预先给出。
但它们的变元的取值范围是不同的。
● KIND的变元可以是任意的固有数据类型;
● SELECTED_INT_KIND的变元是整型变量,它返回的是表示10进制幂次范围的种别参数;
● SELECTED_REAL_KIND的变元是实型变量,它返回的是表示10进制精度与10进制幂次范围的种别参数。
● 数组查询函数。
这类函数包含5个固有函数,它们返回的都是变元数组的各种属性参数。
它们的名称以及返回值列举在下表14-2。
表14-2 数组查询函数的名称以及返回值
函数名称
返 回 值
ALLOCATED
变元数组的分配状态
LBOUND
一个数组或数组的一个维度的下界
SHAPE
数组在每个维度上的元素的数目
SIZE
数组的尺度,即其全部元素的数目
UBOUND
一个数组或数组的一个维度的上界
这5个函数的变元的取值都不需要给出,但如果在SIZE,LBOUND,UBOUND这些函数里面使用可选变元DIM,则DIM的值需要预先定义。
● 指针关联状态查询函数。
这类函数只包含一个固有函数ASSOCIATED,该函数的返回值为逻辑型值,根据该函数所带有的可选变元的不同情况,其返回值也分为以下3种情况:
● 如果不出现可选变元,那么当变元具有指针属性,并且关联到一个目标时,返回值为真。
● 如果出现非指针的可选变元,那么当变元具有指针属性,并且关联到该可选变元时,返回值为真。
● 如果出现可选变元,并且该可选变元也是指针,那么当变元具有指针属性,并且与可选变元都关联到同一个目标时,返回值为真。
● 变元存在查询函数
这类函数只包含一个固有函数PRESENT。
它的变元必须是一个可选哑元的名称。
函数的返回值为逻辑型值。
当作为变元的哑元具有相应的实元时,函数返回值为真,否则为假。
● 数值模式查询函数。
这类函数包含9个固有函数,它们返回的都是变元在整数模式和实数模式表示下的各种参数。
它们的名称以及返回值列举在下表14-3。
表14-3 数值模式查询函数的名称以及返回值
函数名称
返 回 值
DIGITS
整数模式和实数模式公式里面的n值
EPSILON
实变元的
的值
HUGE
按照整数模式和实数模式所能够表示的最大数值
MINEXPONENT
实变元所能够取得的最小的e值
MAXEXPONENT
实变元所能够取得的最大的e值
PRECISION
实数或复数的10进制精度
RADIX
整数模式和实数模式公式里面的基数值
RANGE
整数,实数或复数的10进制幂次范围
TINY
实变元所能够取得的最小的正数值
注意:
●这些函数的变元都不需要预先定义。
●它们都是类过程,因为它们都能够用于任意类型的实变元。
●除了EPSILON,MINEXPONENT,MAXEXPONENT这3个函数之外,它们都能够用于任意类型的整型变元。
与数值模式查询函数类似,数字操作函数同样是基于数值的表示模式得到返回值的,但是它们最大的差别在于,数值模式查询函数所作用的变元代表了整个数值类型,返回的是有关整个数值类型的表示模式参数,而数字操作函数所作用的变元只是在某种特定表示模式下的单个的具体的数值,因此它的变元需要在函数引用之前予以定义。
数字操作函数包括7种,它们的名称以及返回值列举在下表14-4。
表14-4 数字操作函数的名称以及返回值
函数名称
返 回 值
EXPONENT
实数值的实数模式表示公式里面的e值
FRACTION
实数值的小数部分
NEAREST
系统所能够表示的在给定方向上最接近第一个变元的数值
RRSPACING
变元附近的最小间距的倒数
SCALE
用给定的值替换e值
SET_EXPONENT
把e值设置为给定的值
SPACING
变元附近的最小绝对间距
这7个函数只能应用于实数环境,变元可以是任意类型的实数值,而且都是逐元函数。
14.4 转换函数,置空函数NULL以及传递函数
1.转换函数
所谓转换函数就是能够把某种数据对象的类型与种别的某种组合转换为另外一种类型与种别的组合。
所有这些函数都是类函数,因为它们需要处理可能的各种类型与种别的组合,同时,它们也都是逐元的。
转换函数包括15个固有函数,它们的名称以及返回值列举在下表14-5。
表14-5 转换函数的名称以及返回值
函数名称
返 回 值
ACHAR
在ASCII字符集的指定位置的字符
AIMAG
复数的虚部
AINT
把一个实数截断为实型整数
ANINT
把一个实数截断为最接近的实型整数
CHAR
在系统字符集的指定位置的字符
CMPLX
与变元相应的复数值
CONJG
复数变元的共轭复数
DBLE
与变元相应的双精度值
IACHAR
指定字符在ASCII字符集里面的位置
IBITS
以位表示的整型变元的指定子串
ICHAR
指定字符在系统字符集里面的位置
INT
变元被截断得到的整型值
LOGICAL
与变元相应的逻辑型值
NINT
把一个实数截断为最接近的整型值
REAL
与变元相应的实型值
2.置空函数NULL
固有函数NULL返回一个能够赋值给指针变量的去关联的指针。
尽管它的功能与NULLIFY语句的功能一样,但是它们的应用场合不同:
● NULL函数应用于说明语句当中,以便对指针变量进行初始化,还可以在派生类型定义当中定义其指针成员的默认初始化;
● NULLIFY语句作为可执行语句应用于程序当中。
固有函数NULL为变换函数而不是逐元函数。
3.传递函数TRANSFER
固有函数TRANSFER能够在数据的不同类型与种别组合模式之间进行纯粹二进制数据传递,而不需要进行烦琐的类型与种别组合模式的转换。
当一个固有函数TRANSFER作用于一个源数据时,它的二进制表示形式,也就是它的物理存储模式被传递为函数结果,而函数结果的类型与种别组合模式则由函数的MOLD变元决定。
这样在传递过程当中就根本不需要进行类型与种别组合模式的转换。
TRANSFER为变换函数,而不是逐元函数,它的值常常是不具有可移植性的。
14.5 计算函数
所谓计算函数都是针对变元的计算,包括47个固有函数,分为如下三类:
● 数值计算函数;
除了计算机所特有的数据类型以及精度限制之外,数值计算函数可以理解为就是相应的数学计算函数,数值计算函数表示了几乎所有最常用的基本数学函数。
● 字符计算函数;
字符计算函数的主要功能就是对字符串进行编辑。
● 位计算函数。
位计算函数基于数据的位模式表示进行操作与计算。
这3类固有函数的名称以及返回值分别列举在下面的表14-6,表14-7,和表14-8里面。
表14-6 数值计算函数的名称以及返回值
函数名称
返 回 值
ABS
变元的绝对值
ACOS
变元的反余弦值
ASIN
变元的反正弦值
ATAN
变元的反正切值
ATAN2
复数变元(X,Y)的幅角弧度值
CEILING
大于或等于变元值的最小整数值
COS
变元的余弦值
COSH
变元的双曲余弦值
DIM
如果2个变元的差为正数,则返回差值,否则返回0
DOT_PRODUCT
2个秩为1的数组的点积
DPROD
2个单精度数值的双精度乘积
EXP
自然指数函数
FLOOR
小于或等于变元值的最大整数值
LOG
自然对数函数
LOG10
以10为底的对数函数
MATMUL
矩阵乘积
MAX
一个值集合里面的最大值
MIN
一个值集合里面的最小值
MOD
求余函数,其符号与第一个变元的符号一致
MODULO
求余函数,其符号与第二个变元的符号一致
SIGN
赋予给定值给定的符号
SIN
变元的正弦值
SINH
变元的双曲正弦值
SQRT
变元的平方根
TAN
变元的正切值
TANH
变元的双曲正切值
表14-7 字符计算函数的名称以及返回值
函数名称
返 回 值
ADJUSTL
把字符串左边的空格移到它的右边
ADJUSTR
把字符串右边的空格移到它的左边
INDEX
一个子串在给定字符串里面的位置
LEN_TRIM
删除尾部空格后的字符串长度
LGE
基于ASCII序列的大于或等于的比较
LGT
基于ASCII序列的大于的比较
LLE
基于ASCII序列的小于或等于的比较
LLT
基于ASCII序列的小于的比较
REPEAT
重复连接字符串
SCAN
扫描一个字符串以获得给定字符串在其中的位置
TRIM
删除尾部空格后得到的字符串
VERIFY
给出不属于指定字符集里面的字符在字符串里面出现的位置
表14-8 位计算函数的名称以及返回值
函数名称
返 回 值
BTEST
整型变元在指定的位上面的值
IAND
2个整型变元的逻辑AND运算的结果
IBCLR
把一个整型变元的指定的位上的值清0
IBSET
把一个整型变元的指定的位上的值设置为1
IEOR
2个整型变元的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Fortran程序设计第14章 固有过程 Fortran 程序设计 14 固有 过程