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

时间:2013-02-24 22:29:03

标签: fortran gfortran intel-fortran

我正在寻找一种将逻辑类型变量转换为真实类型的防弹方式,它将在ifort和gfortran中运行。以下在ifort中有效,但在gfortran中

logical :: a
real :: b
a = .true.
b = dble(a)

gfortran中抛出的错误是

b = dble(a)
         1
Error: 'a' argument of 'dble' intrinsic at (1) must be a numeric type

显然,.true。应映射到1.d0和.false。到0.d0。这样做的最佳方法是什么?

4 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:7)

我不确定是否有一个内在工具可以做到这一点。我不知道为什么ifort接受了这个,我的猜测是它是一个特定于编译器的功能。

编辑:正如下面https://stackoverflow.com/a/15057846/1624033所指出的那样,有一个内在的合并功能,这正是这里所需要的。

这个选项,特别是因为你希望这是防弹,就是创建你自己的功能。

我没有对此进行过测试,但以下情况可能有效:

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

编辑:我根据以下建议将元素添加到函数声明中。我还在此函数中添加了 pure ,因为它增加了在并行情况下使用它的额外功能,它是很好的文档。然而,这只是我的意见,并没有必要。

答案 2 :(得分:0)

在gfortran中,我正在使用TRANSFER内在类型的工作。 假设一个整数变量my_int,那么:

    my_int = transfer(.false.,my_int)

my_int的结果是预期的0。

答案 3 :(得分:0)

仅需注意,对于当前版本的Intel和Portland编译器,TRANSFER(.true。,1)正确返回Gfortran的值1和(不正确?)返回-1的值。有趣的是,TRANSFER(-1,logical)在后两个编译器中返回TRUE,而在Gfortran中引发语法错误。