Fortran 数值
Fortran 中的数字由 3 种固有数据类型表示:
- 整数类型
- 真实类型
- 复数类型
整数类型
整数类型只能包含整数值。以下示例提取了通常四字节整数中可以容纳的最大值:
program testingIntimplicit noneinteger :: largevalprint *, huge(largeval)end program testingInt
结果为:
2147483647
请注意,huge() 函数给出了特定整数数据类型可以容纳的最大数字。您还可以使用 kind 说明符指定字节数。以下实例演示了这一点:
program testingIntimplicit none!two byte integerinteger(kind = 2) :: shortval!four byte integerinteger(kind = 4) :: longval!eight byte integerinteger(kind = 8) :: verylongval!sixteen byte integerinteger(kind = 16) :: veryverylongval!default integerinteger :: defvalprint *, huge(shortval)print *, huge(longval)print *, huge(verylongval)print *, huge(veryverylongval)print *, huge(defval)end program testingInt
结果为:
32767214748364792233720368547758071701411834604692317316873037158841057272147483647
真实类型
它存储浮点数,如2.0、3.1415、-100.876等。
传统上有两种不同的实数类型:默认实数类型和双精度类型。
然而,Fortran 90/95 通过 kind 说明符提供了对实数和整数数据类型精度的更多控制,我们稍后将对此进行研究。
以下实例显示了真实数据类型的使用:
program divisionimplicit none! Define real variablesreal :: p, q, realRes! Define integer variablesinteger :: i, j, intRes! Assigning valuesp = 2.0q = 3.0i = 2j = 3! floating point divisionrealRes = p/qintRes = i/jprint *, realResprint *, intResend program division
结果为:
0.6666666870
复数类型
它用于存储复数。复数有两部分:实部和虚部。两个连续的数字存储单元存储这两个部分。
例如,复数 (3.0,-5.0) 等于 3.0–5.0i
通用函数 cmplx() 创建一个复数。它产生的结果是,无论输入参数的类型如何,实部和虚部都是单精度的。
program createCompleximplicit noneinteger :: i = 10real :: x = 5.17print *, cmplx(i, x)end program createComplex
结果为:
(10.0000000, 5.17000008)
以下实例演示复数运算:
program ComplexArithmaticimplicit nonecomplex, parameter :: i = (0, 1) ! sqrt(-1)complex :: x, y, zx = (7, 8);y = (5, -7)write(*,*) i * x * yz = x + yprint *, "z = x + y = ", zz = x - yprint *, "z = x - y = ", zz = x * yprint *, "z = x * y = ", zz = x / yprint *, "z = x / y = ", zend program ComplexArithmatic
结果为:
(9.00000000, 91.0000000)z = x + y = (12.0000000, 1.00000000)z = x - y = (2.00000000, 15.0000000)z = x * y = (91.0000000, -9.00000000)z = x / y = (-0.283783793, 1.20270276)
数字的范围、精度和大小
整数的范围、精度和浮点数的大小取决于分配给特定数据类型的位数。
下表显示了整数的位数和范围:
| 位数 | 最大值 | 理由 |
|---|---|---|
| 64 | 9,223,372,036,854,774,807 | (263)–1 |
| 32 | 2,147,483,647 | (231)–1 |
下表显示了位数、最小值和最大值以及精度:
| 位数 | 最大值 | 最小值 | 精度 |
|---|---|---|---|
| 64 | 0.8E+308 | 0.5E–308 | 15–18 |
| 32 | 1.7E+38 | 0.3E–38 | 6-9 |
下面的实例演示:
program rangePrecisionimplicit nonereal:: x, y, zx = 1.5e+40y = 3.73e+40z = x * yprint *, zend program rangePrecision
结果为:
x = 1.5e+401Error : Real constant overflows its kind at (1)main.f95:5.12:y = 3.73e+401Error : Real constant overflows its kind at (1)
让我们使用一个最小值:
program rangePrecisionimplicit nonereal:: x, y, zx = 1.5e+20y = 3.73e+20z = x * yprint *, zz = x/yprint *, zend program rangePrecision
结果为:
Infinity0.402144760
再来看看这个实例:
program rangePrecisionimplicit nonereal:: x, y, zx = 1.5e-30y = 3.73e-60z = x * yprint *, zz = x/yprint *, zend program rangePrecision
结果为:
y = 3.73e-601Warning : Real constant underflows its kind at (1)Executing the program....$demo0.00000000E+00Infinity
Kind 指定符
在科学编程中,人们通常需要知道正在进行工作的硬件平台的数据范围和精度。
内部函数 kind() 允许您在运行程序之前查询硬件数据表示的详细信息。
program kindCheckimplicit noneinteger :: ireal :: rcomplex :: cpprint *,' Integer ', kind(i)print *,' Real ', kind(r)print *,' Complex ', kind(cp)end program kindCheck
结果为:
Integer 4Real 4Complex 4
您还可以检查所有数据类型的类型:
program checkKindimplicit noneinteger :: ireal :: rcharacter :: clogical :: lgcomplex :: cpprint *,' Integer ', kind(i)print *,' Real ', kind(r)print *,' Complex ', kind(cp)print *,' Character ', kind(c)print *,' Logical ', kind(lg)end program checkKind
结果为:
Integer 4Real 4Complex 4Character 1Logical 4