- 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 中,存在两种实数类型:默认实数类型和双精度类型。
但是,Fortran 90/95 通过kind说明符提供了对实数和整数数据类型精度的更多控制。
Kind 属性
不同类型的数字在计算机内部以不同的方式存储。kind属性允许您指定数字在内部的存储方式。例如,
real, kind = 2 :: a, b, c real, kind = 4 :: e, f, g integer, kind = 2 :: i, j, k integer, kind = 3 :: l, m, n
在上面的声明中,实数变量 e、f 和 g 比实数变量 a、b 和 c 具有更高的精度。整数变量 l、m 和 n 可以存储更大的值,并且比整数变量 i、j 和 k 具有更多的存储位数。尽管这取决于机器。
示例
program kindSpecifier implicit none real(kind = 4) :: a, b, c real(kind = 8) :: e, f, g integer(kind = 2) :: i, j, k integer(kind = 4) :: l, m, n integer :: kind_a, kind_i, kind_e, kind_l kind_a = kind(a) kind_i = kind(i) kind_e = kind(e) kind_l = kind(l) print *,'default kind for real is', kind_a print *,'default kind for int is', kind_i print *,'extended kind for real is', kind_e print *,'default kind for int is', kind_l end program kindSpecifier
编译并执行上述程序后,将产生以下结果:
default kind for real is 4 default kind for int is 2 extended kind for real is 8 default kind for int is 4
查询变量的大小
有很多内在函数允许您查询数字的大小。
例如,bit_size(i) 内在函数指定用于存储的位数。对于实数,precision(x) 内在函数返回精度的小数位数,而range(x) 内在函数返回指数的小数范围。
示例
program getSize implicit none real (kind = 4) :: a real (kind = 8) :: b integer (kind = 2) :: i integer (kind = 4) :: j print *,'precision of real(4) =', precision(a) print *,'precision of real(8) =', precision(b) print *,'range of real(4) =', range(a) print *,'range of real(8) =', range(b) print *,'maximum exponent of real(4) =' , maxexponent(a) print *,'maximum exponent of real(8) =' , maxexponent(b) print *,'minimum exponent of real(4) =' , minexponent(a) print *,'minimum exponent of real(8) =' , minexponent(b) print *,'bits in integer(2) =' , bit_size(i) print *,'bits in integer(4) =' , bit_size(j) end program getSize
编译并执行上述程序后,将产生以下结果:
precision of real(4) = 6 precision of real(8) = 15 range of real(4) = 37 range of real(8) = 307 maximum exponent of real(4) = 128 maximum exponent of real(8) = 1024 minimum exponent of real(4) = -125 minimum exponent of real(8) = -1021 bits in integer(2) = 16 bits in integer(4) = 32
获取 Kind 值
Fortran 提供了另外两个内在函数来获取所需精度整数和实数的 kind 值:
- selected_int_kind (r)
- selected_real_kind ([p, r])
selected_real_kind 函数返回一个整数,该整数是给定十进制精度 p 和十进制指数范围 r 所需的 kind 类型参数值。十进制精度是有效数字的位数,十进制指数范围指定可表示的最小和最大数字。因此,范围是从 10-r 到 10+r。
例如,selected_real_kind (p = 10, r = 99) 返回实现 10 位小数精度和至少 10-99 到 10+99 范围所需的 kind 值。
示例
program getKind implicit none integer:: i i = selected_real_kind (p = 10, r = 99) print *,'selected_real_kind (p = 10, r = 99)', i end program getKind
编译并执行上述程序后,将产生以下结果:
selected_real_kind (p = 10, r = 99) 8
广告