kind(x)返回实体或字面量的kind类型参数;把这个常量用于声明和字面量后缀,可以让变量、常量和中间运算采用同一种数值表示。它常用于封装统一精度和避免默认实数混入高精度表达式;适合从已知模型值取得kind,但kind返回的整数只是处理器标签,不能普遍解释为字节数。
语法结构
integer, parameter :: rk = kind(model_value)
real(kind=rk) :: x
x = 1.0_rk / 3.0_rk
- kind是查询函数,结果为标量默认整数,并可在声明所需的常量表达式中使用。
- 字面量后缀_rk在字面量形成时就指定kind;先用默认精度计算再赋给高精度变量,无法补回已经丢失的精度。
- 具体kind值由处理器决定。移植代码应传递kind常量,而不是假定kind=8在所有编译器上都代表同一存储格式。
本文代码
! 查询数值kind,并让参与计算的字面量采用同一kind。
program kindInquiryDemo
implicit none
integer, parameter :: workingKind = kind(1.0d0)
real(kind=workingKind) :: oneThird
oneThird = 1.0_workingKind / 3.0_workingKind
print "(A,I0)", "默认整数kind:", kind(1)
print "(A,I0)", "默认实数kind:", kind(1.0)
print "(A,I0)", "双精度字面量kind:", kind(1.0d0)
print "(A,I0)", "计算结果kind:", kind(oneThird)
print "(A,ES20.12)", "同kind计算的1/3:", oneThird
end program kindInquiryDemo
编译运行
(base) hong@hongdeMacBook-Pro 062.kindInquiry % gfortran -Wall -Wextra -std=f2018 exampleKindInquiry.f90 -o kindInquiryDemo
(base) hong@hongdeMacBook-Pro 062.kindInquiry % ./kindInquiryDemo
默认整数kind:4
默认实数kind:4
双精度字面量kind:8
计算结果kind:8
同kind计算的1/3: 3.333333333333E-01
现象分析
本机gfortran把默认integer和默认real的kind都报告为4,把1.0d0的kind报告为8。这些数字是该处理器的kind标签,不是Fortran标准规定的固定值。
workingKind由kind(1.0d0)取得,oneThird按该kind声明;分子1.0_workingKind和分母3.0_workingKind也在同一kind中形成,因此除法没有先经过默认real。
输出保留了比默认实数更多的1/3有效数字。关键不是写出8,而是让声明、字面量和运算共享workingKind。
核心知识点
- kind返回表示类别标签,不直接返回精度、范围或存储字节数。
- kind值是处理器相关的,程序应使用命名常量传播它。
- 字面量后缀决定常量自身的kind,可避免默认精度中间结果。