Gui*_*hon 6 fortran gfortran intel-fortran
我正在寻找一种将逻辑类型变量转换为真实类型的防弹方式,这种方式可以在ifort和gfortran中使用.以下适用于ifort,但不适用于gfortran:
logical :: a
real :: b
a = .true.
b = dble(a)
Run Code Online (Sandbox Code Playgroud)
gfortran中抛出的错误是
b = dble(a)
1
Error: 'a' argument of 'dble' intrinsic at (1) must be a numeric type
Run Code Online (Sandbox Code Playgroud)
显然,.true.应映射到1.d0和.false.到0.d0.这样做的最佳方法是什么?
除了编写一个函数来处理这个,你还可以直接使用内在的合并函数:b = merge(1.d0, 0.d0, a).或者您可以编写一个定义的赋值子例程来执行此操作,以便您可以只键入b = a.
我不确定是否有一个内在工具可以做到这一点.我不知道为什么ifort接受这个,我的猜测是它是一个编译器特定的功能.
编辑:正如下面的/sf/answers/1054049251/所指出的,有内在的合并功能,这正是这里所需要的.
一个选项,特别是因为你希望这是防弹,是创建自己的功能.
我没有对此进行过测试,但以下内容可能有效:
elemental pure double precision function logic2dbl(a)
logical, intent(in) :: a
if (a) then
logic2dbl = 1.d0
else
logic2dbl = 0.d0
end if
end function logic2dbl
Run Code Online (Sandbox Code Playgroud)
编辑:我根据以下建议在函数声明中添加了元素.我还添加了pure这个函数,因为它增加了在并行情况下使用它的额外功能,它是很好的文档.然而,这只是我的意见,并没有必要.