Fortran Coder

标题: fortran中的种别kind以及selected_real_kind的使用 [打印本页]

作者: szwang    时间: 2017-6-1 09:27
标题: fortran中的种别kind以及selected_real_kind的使用
[Fortran] 纯文本查看 复制代码
program test_kinds

implicit none

integer,parameter :: long=selected_real_kind(9,99)
real :: a=2.8_long

write(*,*) KIND(a)
write(*,*) long
write(*,*) precision(a)
write(*,*) range(a)
write(*,*) huge(a)

stop
end

输出结果分别为:
           4
           8
           6
          37
  3.4028235E+38
-----------------------------------------------------------
疑问:
1、KIND(a)和输出的long的数值,为什么不同?a的kind值不是通过语句real :: a=2.8_long指定的么?
2、定义的long的范围,是(9,99),为什么输出的precision和range是8和6?
3、输出的a的最大数值,不应该是10E99吗?

谢谢各位!


作者: pasuka    时间: 2017-6-1 10:52
请翻阅编译器帮助文档
The GNU Fortran Compiler: SELECTED_REAL_KIND
https://gcc.gnu.org/onlinedocs/g ... D_005fREAL_005fKIND
参考如下范例代码
[Fortran] 纯文本查看 复制代码
program real_kinds
  integer,parameter :: p6 = selected_real_kind(6)
  integer,parameter :: p10r100 = selected_real_kind(10,100)
  integer,parameter :: r400 = selected_real_kind(r=400)
  real(kind=p6) :: x
  real(kind=p10r100) :: y
  real(kind=r400) :: z

  print *, precision(x), range(x)
  print *, precision(y), range(y)
  print *, precision(z), range(z)
end program real_kind

作者: li913    时间: 2017-6-1 10:55
a的kind=4是由定义时决定的,而不是由其值决定。将双精度 2.8_long 赋值给a,并不会改变a的kind
作者: szwang    时间: 2017-6-1 22:13
pasuka 发表于 2017-6-1 10:52
请翻阅编译器帮助文档
The GNU Fortran Compiler: SELECTED_REAL_KIND
https://gcc.gnu.org/onlinedocs/gcc ...

看过例子明白了好多,多谢啦
作者: szwang    时间: 2017-6-1 22:14
li913 发表于 2017-6-1 10:55
a的kind=4是由定义时决定的,而不是由其值决定。将双精度 2.8_long 赋值给a,并不会改变a的kind ...

嗯,感觉有点类似整形与实行相加的时候,会有自动类型转换。这个问题中,后面数字的kind值对前面变量的kind值没有影响。多谢啦
作者: fcode    时间: 2017-6-2 08:00
selected_real_kind(9,99)
并不是选择恰好是精度9,幅度99的kind
计算机并没有提供这么丰富多彩的kind精度的变量类型,而只提供几种(具体因不同编译器而不同)

selected_real_kind 是选择一个,至少满足精度9,幅度99的变量类型,并且其所占内存空间最小。
作者: szwang    时间: 2017-6-2 08:57
fcode 发表于 2017-6-2 08:00
selected_real_kind(9,99)
并不是选择恰好是精度9,幅度99的kind
计算机并没有提供这么丰富多彩的kind精度 ...

嗯嗯,得到的precision(a),应该小于等于selected_real_kind返回的kind所对于的精度。
谢谢你啦。。。
作者: fcode    时间: 2017-6-2 09:32
precision 应该大于等于 selected_real_kind 指定的精度。
应为 selected_real_kind 的结果是“至少满足”




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2