- Fortran 教程
- Fortran - 主页
- Fortran - 概述
- Fortran - 环境设置
- Fortran - 基本语法
- Fortran - 数据类型
- Fortran - 变量
- Fortran - 常量
- Fortran - 运算符
- Fortran - 决策
- Fortran - 循环
- Fortran - 数字
- Fortran - 字符
- Fortran - 字符串
- Fortran - 数组
- Fortran - 动态数组
- Fortran - 派生数据类型
- Fortran - 指针
- Fortran - 基本输入输出
- Fortran - 文件输入输出
- Fortran - 过程
- Fortran - 模块
- Fortran - 内在函数
- Fortran - 数值精度
- Fortran - 程序库
- Fortran - 编程风格
- Fortran - 调试程序
- Fortran 资源
- Fortran - 快速指南
- Fortran - 有用的资源
- Fortran - 讨论
Fortran - 数字
Fortran 中的数字由三种内在数据类型表示 -
- 整数类型
- 真实型
- 复合型
整数类型
整数类型只能保存整数值。以下示例提取通常的四字节整数中可以保存的最大值 -
program testingInt implicit none integer :: largeval print *, huge(largeval) end program testingInt
当您编译并执行上述程序时,它会产生以下结果 -
2147483647
请注意,huge()函数给出了特定整数数据类型可以容纳的最大数字。您还可以使用种类说明符指定字节数。以下示例演示了这一点 -
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
种类说明符
在科学编程中,人们经常需要了解正在执行工作的硬件平台的数据范围和精度。
内部函数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