我正在寻找一种将逻辑类型变量转换为真实类型的防弹方式,它将在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。这样做的最佳方法是什么?
答案 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中引发语法错误。