




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第14章 固有过程固然,我们已经能够做到运用FORTRAN 95来描述任何的计算任务,因为FORTRAN 95所提供的数据类型,固有运算,派生类型,自定义运算,以及构造函数与子例行程序的方法,都足以使得我们应付任何的计算问题。不过FORTRAN 95标准还提供了大量的科学计算的常规计算与函数,都可以作为固有过程直接使用,而不需要我们自己来编写源码。这就好像对于一个汽车装配师,除了给他提供螺栓,轴承之类的标准零件,还给他提供更高层次的标准配件,例如各种型号的发动机,电机之类。因此熟练掌握固有过程,将给我们带来如虎添翼的感觉。FORTRAN 95把固有过程作为标准来提出,就意味着任何的FORTRAN 95的编译器实现版本,都必须能够提供它们:115个固有过程,其中包括109个固有函数和6个固有子例行程序。当然不排除很多的编译器还提供额外的固有过程。正是由于固有过程是属于FORTRAN 95的标准内容,因此和固有运算,例如+,一样,总是“随叫随到”,无论在哪个程序单位内部,只要使用某个固有过程的名称,就等于调用了该固有过程。不过,如果它的名称被用户定义的函数或子例行程序所“侵占”,那么在下面的情况下,被调用的将是用户自定义的函数或子例行程序而不是固有过程: 该自定义函数或子例行程序的界面是显式的; 该自定义函数或子例行程序出现在EXTERNAL语句当中; 该自定义函数属于语句函数。当然上述的名称被侵权的有效范围只是该自定义函数或子例行程序的作用域。相应的,固有过程也就只能在下面的情形下夺回被侵占的名称: 不存在使用该名称的语句函数; 它的名称出现在INTRINSIC语句当中; 相应的用户定义的过程的界面是隐式的。例如在一个模块或一个内部过程里面,由于它的界面是显式的,那么固有过程的名称就能够被侵占,除非固有过程的名称出现在一个有效的INTRINSIC语句当中。下面我们主要讨论固有过程的按照功能的分类,以及每个种类的固有过程所能够完成的计算任务。FORTRAN 95的固有过程主要分为如下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 种过程的过程名称以及相应的变元属性类过程名称种过程名称及其变元种过程变元类型ABSABS(A)CABS(A)DABS(A)IABS(A)默认实型默认复型双精度实型默认整型ACOSACOS(X)DACOS(X)默认实型双精度实型AIMAGAIMAG(Z)默认复型AINTAINT(A)DINT(A)默认实型双精度实型ANINTANINT(A)DNINT(A)默认实型双精度实型ASINASIN(X)DSIN(X)默认实型双精度实型ATANATAN(A)DTAN(A)默认实型双精度实型ATAN2ATAN2(A)DTAN2(A)默认实型双精度实型CHAR*CHAR(I)默认整型COSCOS(X)CCOS(X)DCOS(X)默认实型默认复型双精度实型CONJGCONJG(X)默认复型COSHCOSH(X)DCOSH(X)默认实型双精度实型DIMDIM(X,Y)IDIM(X,Y)默认实型默认整型DPRODDPROD(X,Y)默认实型EXPEXP(X)CEXP(X)DEXP(X)默认实型默认复型双精度实型ICHAR*ICHAR(C)默认字符型INDEXINDEX(STRING,SUBSTRING)默认字符型INT*INT(A)*IFIX(A)*IDINT(A)默认实型默认实型双精度实型LENLEN(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)默认字符型LOGALOG(X)CLOG(X)DLOG(X)默认实型默认复型双精度实型LOG10ALOG10(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,)默认整型默认实型双精度实型默认实型默认整型MODMOD(A,P)AMOD(A,P)DMOD(A,P)默认整型默认实型双精度实型NINTNINT(A)IDNINT(A)默认实型双精度实型REAL*REAL(A)*FLOAT(A)*SNGL(A)默认整型默认整型双精度实型SIGNSIGN(A,B)DSIGN(A,B)ISIGN(A,B)默认实型双精度实型默认整型SINSIN(X)CSIN(X)DSIN(X)默认实型默认复型双精度实型SINHSINH(X)DSINH(X)默认实型双精度实型SQRTSQRT(X)CSQRT(X)SDQRT(X)默认实型默认复型双精度实型TANTAN(X)DTAN(X)默认实型双精度实型TANHTANH(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是某个最大值与最小值之间的整数,表示某种实现所能够表示的数值范围。实数的一般实现方式是按照IEEE 2进制浮点标准,在单精度模式时,取:r=2n=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个变元的差为正数,则返回差值,否则返回0DOT_PRODUCT2个秩为1的数组的点积DPROD2个单精度数值的双精度乘积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整型变元在指定的位上面的值IAND2个整型变元的逻辑AND运算的结果IBCLR把一个整型变元的指定的位上的值清0IBSET把一个整型变元的指定的位上的值设置为1IEOR2个整型变元的逻辑排除OR运算的结果IOR2个整型变元的逻辑包含OR运算的结果ISHFT对变元进行逻辑移位ISHFTC对变元进行逻辑循环移位NOT变元的逻辑补注意: 计算函数当中除了LGE,LGT,LLE,LLT之外都是类过程。 计算函数当中除了DOT_PRODUCT,MATMUL,REPEAT之外都是逐元过程。 位计算函数的结果不可移植。14.6 数组函数数组函数包括17个固有函数,根据它们的功能可以分为5类如下: 数组简化函数; 数组构造函数; 数组重组函数; 数组操作函数; 数组定位函数。这5类函数的名称以及它们的返回值分别列举如下。1. 数组简化函数所谓数组简化函数,从形式上都是把一个数组经过计算之后得到一个标量,或者是得到一个秩为1的数组,它们的的名称以及返回值见表14-9。表14-9 数组简化函数的名称以及返回值函 数 名 称返 回 值ALL如果变元数组的所有元素都是真则取真值ANY如果变元数组的元素当中存在一个真值则取真值COUNT变元数组的元素当中取真值的元素的数目MAXVAL变元数组的元素当中的最大值MINVAL变元数组的元素当中的最小值PRODUCT变元数组的元素的乘积SUM变元数组的元素的和2. 数组构造函数所谓数组构造函数都是从变元数组的元素出发得到一个新的数组,它们
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 惠州消防知识培训班课件地址
- 情绪世界课件
- 情感升华课件
- 销售管理工作方案
- 恶性心律失常的识别课件
- “绿化环境,播种绿色”植树节活动方案
- 老年趣味运动会活动策划方案
- 孤儿学校初中语文随班就读的工作方案
- 护士理论考试题及答案
- 扬州电动车考试试题及答案
- 【《惠东农商银行个人信贷业务发展现状及存在的问题和策略分析》15000字】
- 光伏项目开发培训课件
- 职业年金政策讲解
- 智联猎头企业薪酬调研白皮书-2025年年中盘点
- 基孔肯雅热、登革热等重点虫媒传染病防控技术试题
- 消防设施操作员(监控方向)中级模拟考试题及答案
- 2025年事业单位教师考试公共基础知识试题(含答案)
- 2025年可靠性工程师MTBF计算强化练习
- 2025秋季学期中小学学校学生校服采购工作方案
- 乳房肿块鉴别诊断
- 普速铁路信号维护规则业务管理
评论
0/150
提交评论