Fortran 简明教程

Fortran - Numbers

Fortran 中的数字由三种固有数据类型表示 −

  1. Integer type

  2. Real type

  3. 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