Fortran系列(一):KIND的用法

       声明:参考彭国伦先生《Fortran95程序设计》

Fortran中KIND可以看作是用来声明整型数、浮点数变量所占用的内存字节,当KIND搭配上一些Fortran 90的库函数,可以增加程序代码的跨平台能力。在编译器中,各类变量所保存的至于范围如下:

integer(kind=1)          -128~127
integer(kind=2)          -32768~32767
integer(kind=4)          -2147483648~2147483647
real(kind=4)             ±1.18*10**38~±3.40*10**38

real(kind=8)             ±2.23*10**308~±1.79*10**308


Fortran 90 提供库函数来判断所要记录的数值值域范围所需要的kind值。

SELECTED_INT_KIND(n)
!返回如果想要记录n位整数时,所应声明的kind值。返回-1时,表示无法提供所想要的至于范围
SELECTED_REAL_KIND(n,e)
!返回如果想要能够记录具有n位有效位数、指数达到e位的浮点数所需的kind值。返回-1表示无法满足所需要的有效位数、返回-2表示无法满足所要求的指数范围、返回-3表示两者都无法满足。

下面举个“栗子”:

program main
     implicit none
     integer,parameter :: long_int = selected_int_kind(9)
     !判断可以记录9个位数的整数kind值
     integer,parameter :: short_int = selected_int_kind(3)
     !判断可以记录3个位数的整数kind值
     integer,parameter :: long_real = selected_real_kind(10,50)
     !判断可以记录10个有效数,指数可以记录到50的浮点数kind值
     integer,parameter :: short_real = selected_real_kind(3,3)
     !判断可以记录3个有效数,指数可以记录到3的浮点数kind值
     integer(kind=long_int) :: a=12345678
     integer(kind=short_int) :: b=12
     real(kind=long_real) :: c=1.2356488D45
     real(kind=short_real) :: d=1230

     write(*,"(I3,1X,I10)") long_int,a
     write(*,"(I3,1X,I10)") short_int,b
     write(*,"(I3,1X,E10.5)") long_real,c
     write(*,"(I3,1X,E10.5)") short_real,d

end

上述程序运行的计算结果为:


上述“栗子”中的long_int、short_int 等几个变量都是用来记录KIND值,在程序执行中不会再改变内容,所以对其采用PARAMETER常数声明。而彭国伦先生指出:这个方法其实不太必要,但这样做的原因主要是想在不同机器上保存同样位数的数值,不同的机器是指“等级不同”的机器。查询出各种数值范围所需要的KIND值,可以有效地视需要来使用内存。而所编的程序代码也会比较有“共通性”,因为有可能某个编译器可以提供kind=1的类型。而某些编译器则不行。在程序中不直接用常数,使用sclected_int_kind之类的函数根据程序的需要决定kind值,可以使程序代码更容易在不同的机器之间移植。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值