我正在测试函数selected_real_kind
的值范围(-1:34仅用于踢),以确定它返回的kind
参数以及a使用的实际精度位数使用此kind
定义的变量。但是,由于转换变量RP
,x
和u
(alpha
例如)的函数,我对如何在下面定义变量real(x,RP)
感到困惑。要求RP
(种类型)保持不变。
如果我将RP定义为parameter
,即在顶部写integer, parameter :: RP
我必须立即对其进行初始化,然后我显然无法更改它,因为它是{{1} 1}},所以这不起作用。
这就是我所拥有的:
parameter
答案 0 :(得分:1)
Fortran提供了许多内在函数来查询它处理的数字的特征。有关digits
,precision
和radix
等功能,请参阅您的文档。所有这些(包括我没有提到但你的文档将列出的那些)是通用的(足够的)来处理编译器支持的所有数字类型的输入。
使用这些功能比使用自己的功能更快。正如您所发现的那样,编写自己的通用例程并不是一件简单的事情,因为Fortran希望在编译时知道(或可知)类似的选择器。您还将扩展您对Fortran的了解。
您还可以在内在模块IEEE_ARITHMETIC
中找到感兴趣的功能。
答案 1 :(得分:1)
详细说明我的评论,这是一个python示例:
fortrancode = """
implicit none
integer, parameter :: n=%i
integer,parameter :: rp=selected_real_kind(n)
write(*,*)n,rp
end
"""
from subprocess import call
for n in range(-1,33):
f=open('test.f','w')
f.write(fortrancode%(n)) ! <- n here gets string substituted
!for the '%i' in fortrancode
f.close()
! optional check call(['grep','n=','test.f'])
call(['gfortran','test.f','-o','test.exe'])
call(['./test.exe'])
python test.py
-1 4
0 4
1 4
...
7 8
...
18 10
19 -1
...
32 -1
答案 2 :(得分:1)
与george's answer类似,但在Fortran中。我们注意到种类本质上必须在编译时才能知道。为此,我们向编译器询问它可以为我们提供哪些类型,并为每个类型创建一小块代码进行编译。然后编译并运行它。 [这最后一步肯定因系统而异。]
! Rather than looping over a range with SELECTED_REAL_KIND, just see which
! real kinds are available to the compiler. We can later match up real kinds
! for a requested precision with those here.
use, intrinsic :: iso_fortran_env, only : real_kinds
implicit none
integer output
integer i
open(newunit=output, file='gosh.f90', action='write', position='rewind')
! Here we could instead do n=-1, 34 etc.
do i=1, SIZE(real_kinds)
write(output, 1) real_kinds(i)
end do
write(output, '("end")')
close(output)
! A compile/execute line - do whatever is required.
call execute_command_line('compile gosh.f90 && ./a.out')
1 FORMAT ("block",/,"real(",I0,") x",/,"include 'domystuffz'"/,"end block")
end
其中&#34; domystuffz&#34;是一个包含所需分析的文件。与High Performance Mark's answer一样,内在函数会很好,如果需要,include
可以用一些简单的代码替换。