С компилятором fortran PGI, почему real (.true.) Равен "-1.0", а int (.true.) Равен "-1"? - PullRequest
1 голос
/ 13 мая 2019

Я только что обнаружил этот прекрасный факт. Очевидно, это также верно для Visual Basic ... возможно, ответ похож? А может быть, это относится и к другим языкам?

Редактировать

Очевидно, это работает только для определенных компиляторов - в моем случае, с компилятором pgf90 PGI. Не работает с gfortran.

1 Ответ

3 голосов
/ 13 мая 2019

Это (int(.true.)==-1) НЕ соответствует . Ну, по крайней мере, не в целом.

Во-первых, вы не должны вызывать int() с логическим аргументом. Но ваш компилятор может разрешить это как расширение.

> gfortran realinttrue.f90 
realinttrue.f90:1:13:

 print *,real(.true.), int(.true.)
             1
Error: ‘a’ argument of ‘real’ intrinsic at (1) must have a numeric type
realinttrue.f90:1:26:

 print *,real(.true.), int(.true.)
                          1
Error: ‘a’ argument of ‘int’ intrinsic at (1) must have a numeric type

Возможно, вы имели в виду это вместо:

print *, transfer(.true.,1)
end

В любом случае, единственное, что гарантировано, - это два разных значения, ИСТИНА и ЛОЖЬ. Как они выглядят в памяти, зависит от компилятора. Есть два очевидных варианта. Установите все биты в 1, все установите первые биты в один. Первый - целое значение -1, другой - + 1.

Например, приведенный выше код делает

> ifort trueint.f90 
> ./a.out 
          -1
> ifort trueint.f90 -standard-semantics
> ./a.out 
 1
> gfortran trueint.f90
> ./a.out 
           1

Для real это еще сложнее. Я понятия не имею, как вам удалось получить свой результат.

...