Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Fortran中将逻辑类型转换为双精度_Fortran_Gfortran_Intel Fortran - Fatal编程技术网

在Fortran中将逻辑类型转换为双精度

在Fortran中将逻辑类型转换为双精度,fortran,gfortran,intel-fortran,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 显然,是真的。应映射到1.

我正在寻找一种将逻辑类型变量转换为实数类型的防弹方法,这种方法可以在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

显然,是真的。应映射到1.d0,并且.false。到0.d0。最好的方法是什么

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

编辑:正如下面所指出的,有一个内在的合并功能,这正是这里所需要的

一个选项是创建自己的函数,特别是因为您希望它是防弹的

我尚未对此进行测试,但以下方法可能有效:

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,因为它增加了在并行情况下使用这个函数的额外能力,这是一个很好的文档。但是,这只是我的意见,没有必要。

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

,我正在使用该类型作业的内部传输。 假设一个整数变量my_int,则:

    my_int = transfer(.false.,my_int)

my_int的结果如预期的那样为0。

请注意,TRANSFER(.true.,1)正确返回Gfortran的值1,以及当前版本的英特尔和波特兰编译器的值-1(错误)。有趣的是,对于后两个编译器,TRANSFER(-1,logical)返回TRUE,而对于Gfortran则抛出语法错误。

您应该将值作为函数名返回:
logic2dbl=…
。此外,还应该替换.eq。使用.eqv。如果答案语法正确,我就接受!如果在函数签名中添加
elemental
,则该函数也可用于阵列,则可获得额外积分@jvriesem补充道。太棒了!不管它值多少钱,如果您打开标准检查,iPort应该会抱怨。它工作的原因是处理器有一个扩展,允许逻辑到整数的隐式转换,然后标准提供了从整数到实数的转换。请注意,当您说“显然”时,.TRUE的内部表示形式。看起来绝对不像实值1.0,而在某些处理器上是.TRUE的内部表示形式。与整数值1完全相同(特别是当默认逻辑和逻辑(C_BOOL)是相同的表示形式时)…true.=-1也很常见(整数中的所有位都设置为1,在2的补码中为-1)。
realvar=transfer(logical,1)
(只需为mold输入一个文字整数1)起作用(或似乎起作用)。虽然给出了@WaywiserTundish注释,但不确定它的可移植性有多强“正确返回1的值”是什么意思?为什么1是正确的值,-1是不正确的值?请尝试使用英特尔编译器的
-标准语义
,尽管-1也不违反标准。无论如何,我们有一个完整的问题和答案。我不认为您的答案实际上回答了这里提出的问题。我可能应该将其表述为“不正确”,GNU Fortran结果用作参考。根据Steve Lionel的回答(感谢指针),我理解Intel遵循的逻辑,但由于Portland显示相同的行为,并且使用编译标志似乎不太透明,我只需迭代以查找逻辑向量中的真实条目的数量。