kind后缀字面量用于指定数值字面量的类别,即该变量的值需使用哪种精度。
本文代码
program kindSuffixLiteralsDemo
implicit none
integer,parameter :: dp=kind(1.0d0) ! dp保存双精度real的kind值
print "(A)","kind后缀字面量:"
print "(A,F20.16)","默认实数字面量3.14=",3.14
print "(A,F20.16)","D指数双精度字面量3.14d0=",3.14d0
print "(A,F20.16)","kind后缀双精度字面量3.14_dp=",3.14_dp
end program kindSuffixLiteralsDemo
编译运行
(base) hong@hongdeMacBook-Pro 014.kindLiterals % gfortran exampleKindLiterals.f90
(base) hong@hongdeMacBook-Pro 014.kindLiterals % ./a.out
kind后缀字面量:
默认实数字面量3.14= 3.1400001049041748
D指数双精度字面量3.14d0= 3.1400000000000001
kind后缀双精度字面量3.14_dp= 3.1400000000000001
(base) hong@hongdeMacBook-Pro 014.kindLiterals %
结果分析
- 普通写法:3.14,表示默认类型实数字面量。由于3.14先以默认实数精度保存,再按F20.16格式输出,所以能看到单精度近似误差。
- 传统双精度写法:3.14d0,表示双精度实数字面量。3.14d0是双精度实数字面量。d0中的d表示双精度,0表示指数为 10^0。输出为3.1400000000000001比默认3.14保留了更多有效数字,但仍然是二进制浮点近似,不是精确的十进制3.14。
- kind后缀写法:3.14_dp,表示使用其中的_dp指定的类别。3.14_dp是kind后缀实数字面量。因为本例中:dp=kind(1.0d0),dp表示双精度real的kind值。所以3.14_dp和3.14d0在本例中效果一致,结果相同。
知识点总结
- kind表示fortran数值类型的种别参数。
- 同样是real,可以有不同的kind,例如默认实数、双精度实数等。
- integer,parameter :: dp=kind(1.0d0)表示定义一个整数常量dp,1.0d0表示双精度real的kind值。
- 字面量后面可以加kind后缀,3.14_dp表示这个实数字面量使用dp指定的kind。
- 3.14d0和3.14_dp都可以表示双精度实数字面量。
- 3.14d0是传统写法,直接写出双精度。
- 3.14_dp是kind参数写法,适合大型程序统一管理精度。写法更现代更适合科学计算程序。