Это работает путем создания простого логического выражения. Результат -1, 0, но правильное ли логическое выражение? - PullRequest
0 голосов
/ 04 мая 2020

Операционная система: Windows 10 Компилятор: X manager 6

Код программы, которую я написал:

program nobody
implicit none
INTEGER :: M,N
REAL :: X,Y,Z,O

M = -5
N = 8
X = -3.56
Y = 0.0
Z = 44.7

O = X * Y < SQRT(Z)

print * , O

end program nobody

Когда вычислено, оно равно 0 <6.68580586, поэтому оно становится логическим выражением , При печати результат равен -1.000000. Если логическое выражение верное, -1 выводится? </p>

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Fortran (при ifort x86 и x64) представляет логическое значение .TRUE. как 0xFFFFFFFF и логично. ЛОЖЬ. как 0x0. Если вы хотите присвоить логическое значение переменной REAL, оно сначала преобразуется в значение INTEGER (которое равно -1 для .TRUE. И 0 для .FALSE.), А затем преобразуется в значение REAL. Посмотрите на выходные данные компилятора (я упростил логическое выражение):

 O = M > N
 mov         eax,dword ptr [M]  
 mov         edx,dword ptr [N]  
 cmp         eax,edx  
 jg          MAIN+6Eh (0FB106Eh)  
 mov         dword ptr [ebp-8],0  
 jmp         MAIN+75h (0FB1075h)  
 mov         dword ptr [ebp-8],0FFFFFFFFh  
 mov         eax,dword ptr [ebp-8]  
 cvtsi2ss    xmm0,eax  
 movss       dword ptr [O],xmm0

CVTSI2SS означает «преобразовать INTEGER (4) в REAL (4)». Это преобразование (INTEGER -> REAL) является причиной, по которой вы не видите выход NaN (0xFFFFFFFF - это значение NaN с одинарной точностью, в соответствии со стандартом IEEE 754 для чисел с плавающей запятой).

1 голос
/ 04 мая 2020

"Результат равен -1"

Нет стандартного числового значения логических значений. Здесь происходит то, что компилятор сначала преобразует логическое значение в целое число, просто заново интерпретируя биты, а затем преобразует целое число в действительное число.

В вашем компиляторе логическое истинное значение такое значение, где все биты равны 1. Целочисленное число с таким битовым шаблоном (шестнадцатеричное FFFFFFFF) равно -1. После преобразования в реальное вы получите -1,00000.

Другие компиляторы будут использовать истинное логическое значение в качестве всех нулевых битов вместо младшего, который установлен в 1. В этом случае этот битовый шаблон соответствует целому числу 1 и реальное число будет 1.00000. Если вы используете Intel Fortran, попробуйте установить -standard-semantics и посмотрите, что произойдет.

(Обратите внимание, что не существует компилятора с именем X manager 6. Возможно, вы используете программное обеспечение под названием Xmanager 6 для подключения к некоторому удаленному Linux компьютеру, но это определенно не компилятор Fortran.)

"но является ли логическое выражение правильным?"

Это не правильный стандартный Fortran, но, как нестандартное расширение поставщика, он, скорее всего, делает то, что вы хотели, если вы действительно хотели неявное преобразование логического значения в действительное число. Если вы просто хотели логическое значение, а не число, вы должны использовать логическую переменную

logical ::logical_value

logical value = (X * Y) < SQRT(Z)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...