数字( Numbers)
Fortran中的数字由三种内在数据类型表示 -
- 整数类型
- 真实的类型
- 复杂类型
整数类型
整数类型只能包含整数值。 以下示例提取可以在通常的四字节整数中保存的最大值 -
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
真实的类型
它存储浮点数,例如2.0,3.1415,-100.876等。
传统上有两种不同的real类型:默认的真实类型和double precision类型。
但是,Fortran 90/95通过kind说明符提供了对实数和整数数据类型精度的更多控制,我们将在稍后研究。
以下示例显示了实际数据类型的使用 -
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
复杂类型
这用于存储复数。 复数有两部分:实部和虚部。 两个连续的数字存储单元存储这两个部分。
例如,复数(3.0,-5.0)等于3.0 - 5.0i
泛型函数cmplx()创建一个复数。 它产生的结果是,无论输入参数的类型如何,其实部和虚部都是单精度的。
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)
数字的范围,精度和大小
整数范围,精度和浮点数的大小取决于分配给特定数据类型的位数。
下表显示整数的位数和范围 -
位数 | 最大价值 | 原因 |
---|---|---|
64 | 9,223,372,036,854,774,807 | (2**63)–1 |
32 | 2,147,483,647 | (2**31)–1 |
下表显示了位数,最小值和最大值以及实数的精度。
位数 | 最大的价值 | 最小的价值 | 精确 |
---|---|---|---|
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
种类说明者
在科学编程中,通常需要知道正在进行工作的硬件平台的数据的范围和精度。
内部函数kind()允许您在运行程序之前查询硬件数据表示的详细信息。
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