fortran中的种别kind以及selected_real_kind的使用
program test_kindsimplicit 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吗?
谢谢各位!
请翻阅编译器帮助文档
The GNU Fortran Compiler: SELECTED_REAL_KIND
https://gcc.gnu.org/onlinedocs/gcc-7.1.0/gfortran/SELECTED_005fREAL_005fKIND.html#SELECTED_005fREAL_005fKIND
参考如下范例代码
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 a的kind=4是由定义时决定的,而不是由其值决定。将双精度 2.8_long 赋值给a,并不会改变a的kind pasuka 发表于 2017-6-1 10:52
请翻阅编译器帮助文档
The GNU Fortran Compiler: SELECTED_REAL_KIND
https://gcc.gnu.org/onlinedocs/gcc ...
看过例子明白了好多,多谢啦:-handshake li913 发表于 2017-6-1 10:55
a的kind=4是由定义时决定的,而不是由其值决定。将双精度 2.8_long 赋值给a,并不会改变a的kind ...
嗯,感觉有点类似整形与实行相加的时候,会有自动类型转换。这个问题中,后面数字的kind值对前面变量的kind值没有影响。多谢啦 selected_real_kind(9,99)
并不是选择恰好是精度9,幅度99的kind
计算机并没有提供这么丰富多彩的kind精度的变量类型,而只提供几种(具体因不同编译器而不同)
selected_real_kind 是选择一个,至少满足精度9,幅度99的变量类型,并且其所占内存空间最小。 fcode 发表于 2017-6-2 08:00
selected_real_kind(9,99)
并不是选择恰好是精度9,幅度99的kind
计算机并没有提供这么丰富多彩的kind精度 ...
嗯嗯,得到的precision(a),应该小于等于selected_real_kind返回的kind所对于的精度。
谢谢你啦。。。 precision 应该大于等于 selected_real_kind 指定的精度。
应为 selected_real_kind 的结果是“至少满足”
页:
[1]