种别说明
种别是 F90 的新概念。一个数据 , 不仅有一个类型,并在同一类型下可分为若干种别,种别值确定了数据的大小范围和精度。有了种别说明后,程序更易于移植。因为在不同的计算机系统上,同一种变量类型可以有不同的精度,因此当程序在另一种机子上运行时可能出现溢出或下溢。规定种别后可以避免这种情况的出现。
我们知道,一个数据通常在内序中占一个存贮单元。对整型数而言,如果该变量在程序中使用值范围很小,则只需半个存贮单元。如果变量的整数变化范围很大,则存贮时有必要占两个内存单元。实型数更复杂,除了存贮的数值范围大小不同外,要求精度也会不同,有的只要 8 位有效值即满足,有的则可能要 24 位有效值。这样,它们要求的存贮单元数量不同。为了提高效率,节约内存,按照该变量表达的值范围与表达的精度范围,把同一类划分成几个种别,不同种别分配不同数目的内存单元。
国际标准 FORTRAN90 版本没有规定每个类型必须有哪些种别,具体的种别划分由 FORTRAN 软件开发商自行设置。因此程序员在设计变量时,按该变量表达值的范围、精度要求范围,查阅手册,确定合适的种别,在说明语句中加以说明。
种别由种别选择符说明,写在类型关键字后括号内,其关键字是 KIND ,后跟 '=' 号及种别值。其形式为:类型说明 ([KIND=] 种别值 ) 。
例如要说明变量 X 是实型,种别值是 2 ,说明语句是:
REAL(KIND=2):: X
一个变量必有一个种别,如果变量的类型说明语句中没有种别说明符,如:
REAL:: X, Y
则表示变量 X , Y 的种别缺省,这时采用系统规定的标准值。
Compaq Fortran 提供了如下几类种别值:
整数:有 4 种,种别值即为字节数 n 。
种别值 n | 取值范围 (-28n-1 — 28n-1 -1) |
|
INTEGER([KIND=]1) 或 INTEGER*1 | -128 — 127 |
|
INTEGER([KIND=]2) 或 INTEGER*2 | -32768 — 32767 |
|
INTEGER([KIND=]4) 或 INTEGER*4 | -2147483648 — 2147483647 | 缺省值 |
INTEGER([KIND=]8) 或 INTEGER*8 | -9223372036854775808 — 9223372036854775807 | 仅用于 Alpha 芯片机型 |
实型数:有 3 种。 F90 标准没有规定指数的允许范围和有效位数,。
REAL([KIND=]4) or REAL*4 | 通常实数的范围是 10-38 — 1038 之间的 7 位有效数字 | 缺省值 | |
REAL([KIND=]8) or REAL*8 |
| 等价于双精度型 DOUBLE PRECISION | |
REAL([KIND=]16) or REAL*16 |
| 仅用于 OpenVMS 、 Tru64 UNIX 、 Linux 操作系统 | |
复型数:有 3 种。每种表示整型数据或实型数据的方法都可以用来表示复型数据的实部和虚部。注意简写与完整写法之间的差别。
COMPLEX([KIND=]4) or COMPLEX*8 | 缺省值 |
COMPLEX([KIND=]8) or COMPLEX*16 | 等价于双精度复型 DOUBLE COMPLEX |
COMPLEX([KIND=]16) or COMPLEX*32 | 仅用于 OpenVMS 、 Tru64 UNIX 、 Linux 操作系统 |
逻辑型 :有 4 种
LOGICAL([KIND=]1) or LOGICAL*1 |
|
LOGICAL([KIND=]2) or LOGICAL*2 |
|
LOGICAL([KIND=]4) or LOGICAL*4 | 缺省值 |
LOGICAL([KIND=]8) or LOGICAL*8 | 仅用于 Alpha 芯片机型 |
字符型:有 1 种
CHARACTER([KIND=]1)
字节型 BYTE :取值为 1 个字节,等价于 INTEGER([KIND=]1) 。
F90 中关于种别选择的内部函数有:
KIND(X) :函数 KIND 用于查询变量的种别,它返回 X 的种别值,当 X 取值为 0 时,返回标准种别值即缺省值。如: KIND(0) 返回值是整型的标准种别值, KIND(0.) 、 KIND(.FALSE.) 、 KIND( “ A ” ) 分别返回实型、逻辑型、字符型的标准种别值。
SELECTED_REAL_KIND([n][,m]) :该函数返回实型变量对所取的值范围和精度恰当的种别值。其中 n 是指明十进制有效位的位数, m 指明值范围内以 10 为底的幂次。例如: SELECTED_REAL_KIND(6,70) 的返回值为 8 ,表示一个能表达 6 位精度、值范围在 - 1070 — + 1070 之间实型数的种别值为 8 。但该机型上不能提供满足要求的种别值时,它的返回值是: -1( 当精度位数达不到时 ) , -2( 当数值范围达不到时 ) , -3( 两者都达不到时 ) 。对给定的实型和复型量 X ,它的精度和范围可通过内部函数 PRECISION(X) 和 RANGE(X) 查出。
SELECTED_INT_KIND([m]) :该函数返回整型变量对所取的值范围恰当的种别值。 m 指明值的范围是 - 10m — + 10m 。
可以用 SELECTED_REAL_KIND 或 SELECTED_INT_KIND 定义一个 PARAMETER 常数以备后用,例如下面的语句定义了有 9 位数的整型数。
INTEGER, PARAMETER :: MY_INT_KIND = SELECTED_INT_KIND(9)
INTEGER(MY_INT_KIND) :: HILL
程序中的常数如要标明种别,方法有二。若是数值型常数或逻辑型常数则用后辍法,即后加一下划线,再跟种别值。当实数型数据的指数字母是 D 时,禁止说明种别值。如果复型数据的实部和虚部都是整数,则它的精度和范围与缺省的实型相同。如果两部分都是实型,则它的精度和范围按如下的方法确定:两部分有相同的种别,为该种别,两部分中有不同的种别,则由较大的种别值确定。例如:
21_2+7.6_4 表示整型种别为 2 的数 21 与实型种别为 4 的数 7.6 相加。
3.8E-5_4
0.87D-16 禁止说明种别值
(4.7_8,5) 复型数据表示用括号,逗号分开前面的实部 ( 种别值为 8 的实数 ) 和后面的虚部 ( 缺省种别值的整数 ) 。
.FALSE._4 表示逻辑型,其常数值是假,种别值是 4 。
例:用语句:
INTEGER,PARAMETER :: LONG=SELECTED_REAL_KIND(9,99)
REAL :: A=2.8_LONG, B=1.23456789E60_LONG
来保证常数有需要的 9 位有效数字和 -10-99 — 1099 的指数范围。 PRECISION(A) 和 RANGE(A) 的返回值应是 9 和 99 。
若是字符型常数,则用前辍法,把种别值列在字符常数之前,其间用下划线连接。例如:
5_ ‘αβγ’ 表示希腊字符串αβγ的种别值是 5 。
6_ ‘计算数学’ 表示汉字字符串‘计算数学’的种别值是 6 。
这里假定该机系统支持希腊字字母与汉字,并已规定它们的种别参数是 5 和 6 。对 Compaq Fortran ,只有一种字符型,因此上面的字符常数应写成: 1_ ‘ 计算数学 ’ , 1_ ‘ αβγ ’ ,或: ‘ 计算数学 ’ , ‘ αβγ ’ 。字符串的字符不只限于 Fortran 字符集内,处理系统支持的图形符号也是允许的。
在 F90 中,还可以根据需要定义二进制、八进制和十六进制正整数常量。二进制常量的表示方法是以字母 B 开头,后跟定界符括起来的数字串,定界符 可以是撇号或括号,数字是 0 或 1 ,如: B’01011’ , B(01011) 。八进制常量的表示方法是以字母 O 开头,后跟定界符括起来的数字串,数字范围是 0 至 7 ,如: O’10472’ 。十六进制常量的表示方法是以字母 Z 开头,后跟定界符括起来的数字或字母串,数字范围是 0 至 9 ,字母范围为 A 至 F ,如: Z’18E2D’ 。但要注意,整数的这些形式,仅限于出现在 DATA 赋值语句中。
在 Compaq Fortran 中,还可以这样定义非十进制数:数字 # 数字串 ,最前面的数字表示进制,省略式表示十六进制。如:
2#01011011 -> 二进制
8#43051472 -> 八进制
#A92D80EF -> 十六进制