Fortran 数值

Fortran 中的数字由 3 种固有数据类型表示:

  • 整数类型
  • 真实类型
  • 复数类型

整数类型

整数类型只能包含整数值。以下示例提取了通常四字节整数中可以容纳的最大值:

  1. program testingInt
  2. implicit none
  3. integer :: largeval
  4. print *, huge(largeval)
  5. end program testingInt

结果为:

  1. 2147483647

请注意,huge() 函数给出了特定整数数据类型可以容纳的最大数字。您还可以使用 kind 说明符指定字节数。以下实例演示了这一点:

  1. program testingInt
  2. implicit none
  3. !two byte integer
  4. integer(kind = 2) :: shortval
  5. !four byte integer
  6. integer(kind = 4) :: longval
  7. !eight byte integer
  8. integer(kind = 8) :: verylongval
  9. !sixteen byte integer
  10. integer(kind = 16) :: veryverylongval
  11. !default integer
  12. integer :: defval
  13. print *, huge(shortval)
  14. print *, huge(longval)
  15. print *, huge(verylongval)
  16. print *, huge(veryverylongval)
  17. print *, huge(defval)
  18. end program testingInt

结果为:

  1. 32767
  2. 2147483647
  3. 9223372036854775807
  4. 170141183460469231731687303715884105727
  5. 2147483647

真实类型

它存储浮点数,如2.0、3.1415、-100.876等。

传统上有两种不同的实数类型:默认实数类型和双精度类型。

然而,Fortran 90/95 通过 kind 说明符提供了对实数和整数数据类型精度的更多控制,我们稍后将对此进行研究。

以下实例显示了真实数据类型的使用:

  1. program division
  2. implicit none
  3. ! Define real variables
  4. real :: p, q, realRes
  5. ! Define integer variables
  6. integer :: i, j, intRes
  7. ! Assigning values
  8. p = 2.0
  9. q = 3.0
  10. i = 2
  11. j = 3
  12. ! floating point division
  13. realRes = p/q
  14. intRes = i/j
  15. print *, realRes
  16. print *, intRes
  17. end program division

结果为:

  1. 0.666666687
  2. 0

复数类型

它用于存储复数。复数有两部分:实部和虚部。两个连续的数字存储单元存储这两个部分。

例如,复数 (3.0,-5.0) 等于 3.0–5.0i

通用函数 cmplx() 创建一个复数。它产生的结果是,无论输入参数的类型如何,实部和虚部都是单精度的。

  1. program createComplex
  2. implicit none
  3. integer :: i = 10
  4. real :: x = 5.17
  5. print *, cmplx(i, x)
  6. end program createComplex

结果为:

  1. (10.0000000, 5.17000008)

以下实例演示复数运算:

  1. program ComplexArithmatic
  2. implicit none
  3. complex, parameter :: i = (0, 1) ! sqrt(-1)
  4. complex :: x, y, z
  5. x = (7, 8);
  6. y = (5, -7)
  7. write(*,*) i * x * y
  8. z = x + y
  9. print *, "z = x + y = ", z
  10. z = x - y
  11. print *, "z = x - y = ", z
  12. z = x * y
  13. print *, "z = x * y = ", z
  14. z = x / y
  15. print *, "z = x / y = ", z
  16. end program ComplexArithmatic

结果为:

  1. (9.00000000, 91.0000000)
  2. z = x + y = (12.0000000, 1.00000000)
  3. z = x - y = (2.00000000, 15.0000000)
  4. z = x * y = (91.0000000, -9.00000000)
  5. z = x / y = (-0.283783793, 1.20270276)

数字的范围、精度和大小

整数的范围、精度和浮点数的大小取决于分配给特定数据类型的位数。

下表显示了整数的位数和范围:

位数最大值理由
649,223,372,036,854,774,807(263)–1
322,147,483,647(231)–1

下表显示了位数、最小值和最大值以及精度:

位数最大值最小值精度
640.8E+3080.5E–30815–18
321.7E+380.3E–386-9

下面的实例演示:

  1. program rangePrecision
  2. implicit none
  3. real:: x, y, z
  4. x = 1.5e+40
  5. y = 3.73e+40
  6. z = x * y
  7. print *, z
  8. end program rangePrecision

结果为:

  1. x = 1.5e+40
  2. 1
  3. Error : Real constant overflows its kind at (1)
  4. main.f95:5.12:
  5. y = 3.73e+40
  6. 1
  7. Error : Real constant overflows its kind at (1)

让我们使用一个最小值:

  1. program rangePrecision
  2. implicit none
  3. real:: x, y, z
  4. x = 1.5e+20
  5. y = 3.73e+20
  6. z = x * y
  7. print *, z
  8. z = x/y
  9. print *, z
  10. end program rangePrecision

结果为:

  1. Infinity
  2. 0.402144760

再来看看这个实例:

  1. program rangePrecision
  2. implicit none
  3. real:: x, y, z
  4. x = 1.5e-30
  5. y = 3.73e-60
  6. z = x * y
  7. print *, z
  8. z = x/y
  9. print *, z
  10. end program rangePrecision

结果为:

  1. y = 3.73e-60
  2. 1
  3. Warning : Real constant underflows its kind at (1)
  4. Executing the program....
  5. $demo
  6. 0.00000000E+00
  7. Infinity

Kind 指定符

在科学编程中,人们通常需要知道正在进行工作的硬件平台的数据范围和精度。

内部函数 kind() 允许您在运行程序之前查询硬件数据表示的详细信息。

  1. program kindCheck
  2. implicit none
  3. integer :: i
  4. real :: r
  5. complex :: cp
  6. print *,' Integer ', kind(i)
  7. print *,' Real ', kind(r)
  8. print *,' Complex ', kind(cp)
  9. end program kindCheck

结果为:

  1. Integer 4
  2. Real 4
  3. Complex 4

您还可以检查所有数据类型的类型:

  1. program checkKind
  2. implicit none
  3. integer :: i
  4. real :: r
  5. character :: c
  6. logical :: lg
  7. complex :: cp
  8. print *,' Integer ', kind(i)
  9. print *,' Real ', kind(r)
  10. print *,' Complex ', kind(cp)
  11. print *,' Character ', kind(c)
  12. print *,' Logical ', kind(lg)
  13. end program checkKind

结果为:

  1. Integer 4
  2. Real 4
  3. Complex 4
  4. Character 1
  5. Logical 4

分类导航