fortran fortran中文资料网
手气不错
Article

062.kindInquiry_KIND查询与同类字面量

2026年10月9日基础级

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,可避免默认精度中间结果。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注