1

Я использую Intel Fortran в Visual Studio 2012 для компиляции кода Fortran. Когда я пытаюсь использовать логические операторы, я заметил, что автономное логическое выражение приводит к T или F, как и ожидалось. Тем не менее, если мне нужно численное T или F (0 или 1), я получаю -1, когда логический результат Т.Числовой эквивалент TRUE равен -1?

Например:

integer*4 a 
a = 1 
logicval = (node(5,L).gt.0) 
numval = 1*(node(5,L).gt.0) 
write(*,*) logicval, numval 

выведет

Т , -1

Есть ли способ, которым я могу переопределить числовые значения, присвоенные T &?

+0

Обратите внимание, что нет Visual Studio Fortran. Существует несколько поставщиков компиляторов Fortran, но наиболее распространенным является Intel. –

+0

@ VladimirF Я использую Intel FORTRAN и использую Visual Studio в качестве среды IDE. Я должен отредактировать, чтобы сделать его более ясным. – Mithil

ответ

2

Да, что, как ожидается, Intel Fortran правда действительно -1, потому что все биты устанавливаются в 1.

Кроме того, ваше использование целых чисел в виде логических (булевых) переменных совершенно нестандартным. Вы должны сделать свой код на несколько строк дольше и всегда делать правильное преобразование. Ваш integer_var = 1*(node(5,L).gt.0) не разрешен в Fortran, и ему будет отклонено многими компиляторами. Если вы отпустите 1*, gfortran выдает предупреждение, но ваша форма приводит к ошибке.


Вы можете просто конвертировать ваши логические выражения и целые числа в стандартном соответствии сторонней

if (l) then 
    x = 1 
    else 
    x = 0 
    end if 

Вы можете преобразовать Fortran логических массивов целочисленных массивы с 1 и 0 легко с помощью MERGE() intrisic или с помощью WHERE.


легко исправить для Intel Fortran, вероятно, -fpscomp logicals для Intel Fortran, который переключает лечение LOGICAL типа рассмотреть что-либо отличное от нуля, как верно и делает константу .true. быть эквивалентно целому числу 1.

Тем не менее быть потому что он не делает вашу программу переносимой, она просто работает вокруг одной проблемы переносимости в одном конкретном компиляторе.


Вы можете использовать C совместимую логический тип в соответствии с определением в представлении Intel C:

use iso_c_binding 

logical(c_bool) :: variable 

Они будут иметь значения +1 и 0, как C99 диктует для _Bool. Если вам нужно, чтобы они были совместимы с int, вы должны сделать некоторое простое преобразование. C_int не совместим с c_bool.

В зависимости от версии Intel Compiler вам может потребоваться -standard-semantics (или -fpscomp logicals) для правильного logical(c_bool). Я считаю это очень несчастным.

+0

Это довольно всеобъемлющий и весьма полезный для меня. Спасибо большое! – Mithil

+1

К сожалению, это еще один случай, когда новый стандарт указывает поведение, противоречащее давно существующей практике. Intel Fortran получен из DEC Fortran, который принял теорию «четный/нечетный» для LOGICAL еще в 1970-х годах, что было очень полезно для тестов на аппаратном обеспечении VAX (у него была пара инструкций с четным/установленным ключом) и для интерпретация значений условий VMS. Только в Fortran 2003 стандарт ничего не говорил о представлении типов LOGICAL, а затем только наклонно. То, что я считаю неудачным, было включение LOGICAL в качестве совместимого типа. –

+0

@SteveLionel Я просто подумал, что интероперабельный вид может иметь различное представление от типа по умолчанию, и никакой флаг не понадобится. –

4

Как утверждают другие, значение Intel Fortran по умолчанию для этого нестандартного использования заключается в том, что целочисленные значения с низким битовым набором (нечетные) являются истинными, даже значения (с низким битом) являются ложными. Постоянная .TRUE. имеет битовую структуру -1.Это становится более сложным, когда вы делаете конверсии и до версии 17 компилятор не был полностью последовательным в этом. Обратите внимание: если вы используете -стандарт-семантику, подразумевается логика -fpscomp.

Просьба ознакомиться с https://software.intel.com/en-us/forums/intel-visual-fortran-compiler-for-windows/topic/275071#comment-1548435, а также примечаниями к выпуску версии 17 (https://software.intel.com/en-us/articles/intel-fortran-compiler-170-release-notes) для получения информации об изменениях в этой версии для обработки операций с числовым логическим преобразованием.

+1

Большое спасибо. Ваш связанный пост был очень полезен. И просто BTW, ваши ответы/сообщения на веб-сайте Intel весьма полезны и очень помогли мне в нескольких случаях. – Mithil

 Смежные вопросы

  • Нет связанных вопросов^_^