在Fortran中将逻辑类型转换为double

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.这样做的最佳方法是什么?

sig*_*gma 8

除了编写一个函数来处理这个,你还可以直接使用内在的合并函数:b = merge(1.d0, 0.d0, a).或者您可以编写一个定义的赋值子例程来执行此操作,以便您可以只键入b = a.


phy*_*hun 7

我不确定是否有一个内在工具可以做到这一点.我不知道为什么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这个函数,因为它增加了在并行情况下使用它的额外功能,它是很好的文档.然而,这只是我的意见,并没有必要.