Fortran的数字
Fortran中的数字由三个固有的数据类型来表示:
- 整型
- 房地产类型
- 复杂类型
整型
整数类型只能容纳整数值。下面的例子中提取,可以在通常的4字节的整数是容纳最大价值:
program testingInt implicit none integer :: largeval print *, huge(largeval) end program testingInt
当你编译和执行上面的程序它产生以下结果:
2147483647
请注意, 大()函数给出可由特定整数数据类型被保持的最大数目。还可以指定使用的那种符的字节数。下面的例子说明了这一点:
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等
传统上有两种不同类型的实 :默认的实型和双精度型。
然而,Fortran语言90/95提供了真实和整数数据类型通过一种说明,我们很快就会研究精密的控制。
下面的例子说明了如何使用真实的数据类型:
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
那种说明符
在科学程序设计,人们往往需要知道在其上的工作正在做的硬件平台的数据的范围和精度。
本征函数一种()允许您运行程序前查询硬件的数据表示的细节。
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*1 :: 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