Fortran - 数字

Fortran 中的数字由三种内在数据类型表示 −

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

整数类型

整数类型只能保存整数值。 以下示例提取通常的四字节整数中可以保存的最大值 −

program testingInt
implicit none

   integer :: largeval
   print *, huge(largeval)
   
end program testingInt

当你编译并执行上面的程序时,它会产生以下结果 −

2147483647

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

program testingInt
implicit none

   !两字节整数
   integer(kind = 2) :: shortval
   
   !四字节整数
   integer(kind = 4) :: longval
   
   !八字节整数
   integer(kind = 8) :: verylongval
   
   !十六字节整数
   integer(kind = 16) :: veryverylongval
   
   !默认整数
   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 通过 kind 说明符提供了对实数和整数数据类型精度的更多控制,我们将很快研究它。

下面的例子展示了实数数据类型的使用 −

program division   
implicit none

   ! 定义实数变量
   real :: p, q, realRes 
   
   ! 定义整型变量
   integer :: i, j, intRes  
   
   ! 赋值
   p = 2.0 
   q = 3.0    
   i = 2 
   j = 3  
   
   ! 浮点除法
   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 类型说明符

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

内在函数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