selected_real_kind按十进制有效数字p、十进制指数范围r以及可选基数radix选择real kind。它常用于误差容限明确的模拟、跨尺度物理量和数值库接口;适合从算法需求反推表示模型,并应先确认返回值为非负数。
语法结构
integer, parameter :: rk = selected_real_kind(p, r [, radix])
real(kind=rk) :: value
value = 1.0_rk
- p要求至少具有相应十进制精度,r要求至少具有相应十进制指数范围;二者不是小数位数和最大指数值本身。
- 若多个real kind满足要求,返回十进制精度最小的一个。Fortran 2008及以后允许省略p或r,并可用radix限制模型基数。
- 负返回值表示精度、范围或基数要求无法满足,不能把它用于real(kind=…)声明。
本文代码
! 按十进制精度和指数范围选择实数kind。
program selectedRealKindDemo
implicit none
integer, parameter :: simulationKind = selected_real_kind(p=15, r=300)
integer, parameter :: unavailableKind = selected_real_kind(p=1000, r=10000)
real(kind=simulationKind) :: ratio
ratio = 1.0_simulationKind / 7.0_simulationKind
print "(A,I0)", "满足p=15、r=300的kind:", simulationKind
print "(A,I0)", "实际十进制精度:", precision(ratio)
print "(A,I0)", "实际十进制指数范围:", range(ratio)
print "(A,ES24.16)", "1/7:", ratio
print "(A,I0)", "无法满足要求时的返回值:", unavailableKind
end program selectedRealKindDemo
编译运行
(base) hong@hongdeMacBook-Pro 064.selectedRealKind % gfortran -Wall -Wextra -std=f2018 exampleSelectedRealKind.f90 -o selectedRealKindDemo
(base) hong@hongdeMacBook-Pro 064.selectedRealKind % ./selectedRealKindDemo
满足p=15、r=300的kind:8
实际十进制精度:15
实际十进制指数范围:307
1/7: 1.4285714285714285E-01
无法满足要求时的返回值:-3
现象分析
p=15、r=300在本机选择kind=8;precision与range查询分别返回15和307,均达到请求下限。kind值8只是本机标签。
1.0_simulationKind/7.0_simulationKind从字面量到除法都使用所选kind,输出显示约15位十进制有效数字。
p=1000、r=10000同时超出本机可用模型,返回-3。应用程序应统一以结果小于0判断失败,再根据需求降级或报错,而不能继续声明该kind。
核心知识点
- selected_real_kind按精度、指数范围和可选基数选择real kind。
- precision与range可验证处理器实际提供的模型能力。
- 负返回值表示请求无法满足,必须在用于声明前处理。
- 变量和字面量应共同使用所选kind。