Pregunta Convierte el tipo lógico al doble en Fortran


Estoy buscando una forma a prueba de balas de convertir las variables de tipo lógico al tipo real que funcionará tanto en ifort como en gfortran. Lo siguiente funciona en ifort, pero no en gfortran:

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

El error arrojado en gfortran es

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

Obviamente,. Cierto. debería mapear a 1.d0 y .false. a 0.d0. ¿Cuál es la mejor manera de hacer esto?


6
2018-02-24 22:29


origen


Respuestas:


No estoy seguro si hay una herramienta intrínseca que hace esto. No sé por qué ifort acepta esto, y supongo que es una funcionalidad específica del compilador.

Editar: como se señala en https://stackoverflow.com/a/15057846/1624033 a continuación, está el intrínseco unir función que es exactamente lo que se necesita aquí.

una opción para esto, específicamente porque quiere que esto sea a prueba de balas, es crear su propia función.

No he probado esto, pero podría funcionar lo siguiente:

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

Editar: agregué elemental a la declaración de la función basada en los consejos a continuación. También agregué puro a esta función, ya que agrega la capacidad extra de usar esto en situaciones paralelas y es una buena documentación. Sin embargo, esto es solo mi opinión y no es necesario.


7
2018-02-24 22:40



Además de escribir una función para manejar esto, también puede usar directamente la función de fusión intrínseca: b = merge(1.d0, 0.d0, a). O puede escribir una subrutina de asignación definida que hace esto, para que pueda simplemente escribir b = a.


8
2018-02-24 23:15



En gfortran, estoy usando la TRANSFERENCIA intrínseca para ese tipo de trabajo. Suponiendo una variable entera my_int, entonces:

    my_int = transfer(.false.,my_int)

el resultado de my_int es 0 como se esperaba.


0
2018-04-01 20:34