Fortran 简明教程
Fortran - Numbers
Fortran 中的数字由三种固有数据类型表示 −
-
Integer type
-
Real type
-
Complex type
Integer Type
整型只能保存整数值。以下示例提取了一个普通四字节整数中可以保存的最大值 −
program testingInt
implicit none
integer :: largeval
print *, huge(largeval)
end program testingInt
当您编译并执行以上程序时,将生成以下结果——
2147483647
请注意, huge() 函数给出特定整数数据类型可以保存的最大数字。您还可以使用 kind 说明符指定字节数。以下示例对此进行了说明 -
program testingInt
implicit none
!two byte integer
integer(kind = 2) :: shortval
!four byte integer
integer(kind = 4) :: longval
!eight byte integer
integer(kind = 8) :: verylongval
!sixteen byte integer
integer(kind = 16) :: veryverylongval
!default integer
integer :: defval
print *, huge(shortval)
print *, huge(longval)
print *, huge(verylongval)
print *, huge(veryverylongval)
print *, huge(defval)
end program testingInt
当您编译并执行以上程序时,将生成以下结果——
32767
2147483647
9223372036854775807
170141183460469231731687303715884105727
2147483647
Real Type
It stores the floating point numbers, such as 2.0, 3.1415, -100.876, etc.
传统上有两种不同的 @ {s0} 类型:默认实数类型和 @ {s1} 类型。
但是,Fortran 90/95 通过我们稍后将研究的 @ {s2} 说明符提供了对实数和整数数据类型精度的更多控制。
The following example shows the use of real data type −
program division
implicit none
! Define real variables
real :: p, q, realRes
! Define integer variables
integer :: i, j, intRes
! Assigning values
p = 2.0
q = 3.0
i = 2
j = 3
! floating point division
realRes = p/q
intRes = i/j
print *, realRes
print *, intRes
end program division
当您编译并执行以上程序时,将生成以下结果——
0.666666687
0
Complex Type
这用于存储复数。复数有两个部分:实部和虚部。两个连续的数值存储单元存储这两个部分。
For example, the complex number (3.0, -5.0) is equal to 3.0 – 5.0i
通用函数 @ {s3} 创建一个复数。它产生一个实部和虚部均为单精度的结果,而不管输入参数的类型如何。
program createComplex
implicit none
integer :: i = 10
real :: x = 5.17
print *, cmplx(i, x)
end program createComplex
当您编译并执行以上程序时,将生成以下结果——
(10.0000000, 5.17000008)
以下程序演示复数算术 −
program ComplexArithmatic
implicit none
complex, parameter :: i = (0, 1) ! sqrt(-1)
complex :: x, y, z
x = (7, 8);
y = (5, -7)
write(*,*) i * x * y
z = x + y
print *, "z = x + y = ", z
z = x - y
print *, "z = x - y = ", z
z = x * y
print *, "z = x * y = ", z
z = x / y
print *, "z = x / y = ", z
end 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)
The Range, Precision and Size of Numbers
整数范围、浮点数的精度和大小取决于分配给特定数据类型的位数。
下表显示了整数的位数和范围 −
Number of bits |
Maximum value |
Reason |
64 |
9,223,372,036,854,774,807 |
(2**63)–1 |
32 |
2,147,483,647 |
(2**31)–1 |
下表显示了实数的位数、最小值和最大值以及精度。
Number of bits |
Largest value |
Smallest value |
Precision |
64 |
0.8E+308 |
0.5E–308 |
15–18 |
32 |
1.7E+38 |
0.3E–38 |
6-9 |
以下示例展示了这一点 −
program rangePrecision
implicit none
real:: x, y, z
x = 1.5e+40
y = 3.73e+40
z = x * y
print *, z
end program rangePrecision
当您编译并执行以上程序时,将生成以下结果——
x = 1.5e+40
1
Error : Real constant overflows its kind at (1)
main.f95:5.12:
y = 3.73e+40
1
Error : Real constant overflows its kind at (1)
现在让我们使用一个较小的数字 −
program rangePrecision
implicit none
real:: x, y, z
x = 1.5e+20
y = 3.73e+20
z = x * y
print *, z
z = x/y
print *, z
end program rangePrecision
当您编译并执行以上程序时,将生成以下结果——
Infinity
0.402144760
现在让我们观测下溢 −
program rangePrecision
implicit none
real:: x, y, z
x = 1.5e-30
y = 3.73e-60
z = x * y
print *, z
z = x/y
print *, z
end program rangePrecision
当您编译并执行以上程序时,将生成以下结果——
y = 3.73e-60
1
Warning : Real constant underflows its kind at (1)
Executing the program....
$demo
0.00000000E+00
Infinity
The Kind Specifier
在科学编程中,人们经常需要了解正在完成工作的硬件平台的数据范围和精度。
固有函数 @ {s4} 允许您在运行程序之前查询硬件数据表示的详细信息。
program kindCheck
implicit none
integer :: i
real :: r
complex :: cp
print *,' Integer ', kind(i)
print *,' Real ', kind(r)
print *,' Complex ', kind(cp)
end program kindCheck
当您编译并执行以上程序时,将生成以下结果——
Integer 4
Real 4
Complex 4
您还可以检查所有数据类型的种类 −
program checkKind
implicit none
integer :: i
real :: r
character :: c
logical :: lg
complex :: cp
print *,' Integer ', kind(i)
print *,' Real ', kind(r)
print *,' Complex ', kind(cp)
print *,' Character ', kind(c)
print *,' Logical ', kind(lg)
end program checkKind
当您编译并执行以上程序时,将生成以下结果——
Integer 4
Real 4
Complex 4
Character 1
Logical 4