6

我正在寻找一种将逻辑类型变量转换为可在 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

4 回答 4

12

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

于 2013-02-24T23:15:15.930 回答
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,因为它增加了在并行情况下使用它的额外能力,并且它是很好的文档。然而,这只是我的意见,没有必要。

于 2013-02-24T22:40:50.637 回答
0

在 gfortran 中,我将 TRANSFER 内在用于该类型的工作。假设一个整数变量 my_int 然后:

    my_int = transfer(.false.,my_int)

my_int 的结果是 0 正如预期的那样。

于 2015-04-01T20:34:03.397 回答
0

请注意,TRANSFER(.true.,1) 使用 Gfortran 正确返回值 1,并且(不正确?)使用当前版本的 Intel 和 Portland 编译器返回 -1 值。有趣的是,TRANSFER(-1,logical) 在后两个编译器中返回 TRUE,而在 Gfortran 中抛出语法错误。

于 2020-10-01T16:36:40.857 回答