Преобразование логического типа в double в 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.D0 и .ложный. до 0.д0. Как лучше всего это сделать?

3 ответов


Я не уверен, есть ли внутренний инструмент, который делает это. Я не знаю, почему ifort принимает это, и я предполагаю, что это конкретный компилятор функций.

Edit: как указано в https://stackoverflow.com/a/15057846/1624033 ниже, есть внутреннее слияние


в дополнение к написанию функции для обработки этого, вы также можете напрямую использовать встроенную функцию слияния:b = merge(1.d0, 0.d0, a). Или вы можете написать определенную подпрограмму назначения, которая делает это, так что вы можете просто ввести b = a.


в gfortran я использую внутреннюю передачу для этого типа задания. Предполагая целочисленную переменную my_int тогда:

    my_int = transfer(.false.,my_int)

результат my_int равен 0, как и ожидалось.