Szukam kuloodpornego sposobu konwersji zmiennych typu logicznego na prawdziwy typ, który będzie działał zarówno w ifort, jak i gfortran. Następujące prace w ifort, ale nie w gfortran:Konwertuj typ logiczny na podwójny w Fortranie
logical :: a
real :: b
a = .true.
b = dble(a)
Błąd wrzucony gfortran jest
b = dble(a)
1
Error: 'a' argument of 'dble' intrinsic at (1) must be a numeric type
Oczywiście .true. powinien zamapować na 1.d0 i .false. do 0.d0. Jaki jest najlepszy sposób na zrobienie tego?
Za to, co warto, po włączeniu standardowego sprawdzania, na które aplikacja ifort powinna się skarżyć. Powodem, dla którego działa, jest to, że procesor ma rozszerzenie, które pozwala na niejawną konwersję logicznej na liczbę całkowitą, wówczas standard zapewnia konwersję z liczby całkowitej na rzeczywistą. Zauważ, że kiedy powiesz "oczywiście" wewnętrzną reprezentację .TRUE. będzie wyglądać zupełnie jak prawdziwa wartość 1.0, podczas gdy na * niektórych * procesorach wewnętrzna reprezentacja .TRUE. jest dokładnie taka sama jak wartość całkowita równa 1 (szczególnie, jeśli domyślna logiczna i LOGICZNA (C_BOOL) są tą samą reprezentacją). – IanH
.true. = -1 jest również powszechne (wszystkie bity w liczbie całkowitej są ustawione na 1, co w uzupełnieniu 2 = -1). – WaywiserTundish