跳转到内容

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
华夏公益教科书