Fortran/数据类型
变量和数据声明必须出现在所有 Fortran 程序单元的开头,在任何可执行语句之前。变量可能具有指定其在内存中大小的“类型”。类型参数对每个编译器或处理器可能具有不同的含义,因此请务必检查编译器文档中可用的类型。
有几种方法可以声明变量。现代 Fortran 风格是详细且明确的。以下示例声明一个类型为 8 的实数数组(在大多数编译器中,这意味着 8 字节长,即双精度)。
! Modern variable declaration
! <datatype> [(kind=<num>), <attribute>, ... ::] <identifier>[, ...]
! Example:
real (kind=8), dimension (3) :: variable
dimension
属性非常长,但当在单行上声明多个数组时可能更简洁。如果要声明单个变量,则在标识符旁边使用括号指定维度可能更简洁。
real (kind=8) :: variable(3)
变量也可以使用赋值进行初始化。
real (kind=8) :: variable(3) = 1.0
::
对于向后兼容旧版 Fortran 是可选的。旧版声明使用 *
来表示变量的类型。
REAL*8 variable(3)
此外,可以完全省略类型,以简单地使用编译器的默认类型。
real variable(3)
整数数据类型存储带符号整数(即 ..., -3, -2, -1, 0, 1, 2, 3, ...)。在大多数编译器中,默认类型将整数存储为 4 字节大小的短整数(kind=4
)。长整数通常为 8 字节(kind=8
)。允许的属性有:可分配、内在、公有、异步、可选、保存、参数、绑定、指针、目标、维度(dims)、私有、值、外部、保护、易变和意图(inout)。
integer :: variable
逻辑数据类型存储布尔值,只能包含值 .true.
或 .false.
。大多数编译器的默认逻辑类型为 4,占用 4 字节。因此,逻辑在内存方面与整数非常相似,但整数和逻辑通常不兼容大多数运算。允许的属性有:可分配、内在、公有、异步、可选、保存、参数、绑定、指针、目标、维度(dims)、私有、值、外部、保护、易变、意图(inout)。
logical :: variable
实数数据类型存储浮点数据。值以科学记数法的形式存储在内存中,作为尾数和指数。实数变量的默认类型为 4,包含 4 字节(32 位)。在这种情况下,24 位用于尾数,8 位用于指数。允许的属性有:可分配、内在、公有、异步、可选、保存、参数、绑定、指针、目标、维度(dims)、私有、值、外部、保护、易变、意图(inout)。
所有编译器都至少支持两种类型的实数类型,用于低精度和高精度数字。但标准没有指定这些精度的大小。大多数编译器使用 32 位表示单精度,使用 64 位表示双精度。因此,许多编译器支持使用可用更高精度的 double precision
实数数据类型。但是,为了可移植性,最好使用 selected_real_kind
内在函数为变量精度选择所需的类型参数。
real :: variable
double precision :: variable2
在数学中,复数 具有实部和虚部。Fortran 中的复数以矩形坐标的形式存储为一对实数(实部在前,虚部在后)。复数的默认类型始终与实数数据类型的默认类型相同。因此,类型为 4 的复数变量将包含两个类型为 4 的实数。如果类型为 4 的实数对应于 4 字节,则默认的复数变量将为 8 字节大小。允许的属性有:可分配、内在、公有、异步、可选、保存、参数、绑定、指针、目标、维度(dims)、私有、值、外部、保护、易变、意图(inout)。
complex :: variable
所有算术运算符都可以在任一边使用复数。Fortran 自动处理复数运算和虚数的特殊规则。
在使用可能导致错误的函数调用时必须小心。例如,对实数 -1.0
求平方根将导致错误,因为 -1 超出了实数平方根的域。对复数 (-1.0,0.0)
求平方根是允许的,因为 -1 位于复数平方根的域中。
字符数据类型存储字符串。字符变量的默认类型通常为 1,表示 ASCII 字符。类型 2 通常表示 ISO 10646 标准字符。字符变量的独特之处在于除了 kind
之外,它们还具有 len
参数,该参数指定字符串中的字符数。通常单个字符占用内存中的 1 字节。除此之外,字符数据类型也可以是数组。
character (len=5,kind=1), dimension (2) :: strings
旧版声明没有类型参数,只有长度参数。
CHARACTER*5 strings(2)
表达式中嵌入的数据被称为字面量或常量。字面量可以根据其写法具有特定的数据类型。例如,在以下行中,值 1 是一个整数。
a = a + 1
下表展示了如何键入字面量常量。
类型 | 示例字面量 |
---|---|
整数 | 0 , -1 , 9999
|
逻辑 | .true. , .false. , T , F |
实数 | 1.1 , 0.0005 , -99.9e-99 |
复数 | (-1.0,3) , (0.5,-3e5) |
字符 | 'Hello' |
请注意,复数的括号表示法不能用于变量。例如,(a, b)
是无效的。要将实数变量转换为复数,请使用 cmplx
函数
cmplx(a, b)
任何涉及复数和其他数字的表达式都会被提升为复数。
参数常量
[edit | edit source]常量字面量只是无名的数据。变量也可以是常量。它们通过 parameter
属性声明。这些变量是不可变的,在声明后对它们赋值会导致错误。它们在声明时必须初始化一个值。
real, parameter :: PI = 3.141592