2013-02-24 77 views
6

我正在尋找一種將邏輯類型變量轉換爲實際類型的防彈方法,該方法可以在ifort和gfortran中工作。在ifort下面的作品,但不 gfortran:在Fortran中將邏輯類型轉換爲雙精度

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 

顯然,.TRUE。應映射到1.d0和.false。到0.d0。這樣做的最好方法是什麼?

+0

對於它的價值,如果你打開標準檢查ifort應該抱怨。它工作的原因是處理器有一個允許將邏輯隱式轉換爲整數的擴展,然後標準提供從整數到實數的轉換。請注意,當你明顯地說「.TRUE」的內部表示時。將看起來完全沒有像1.0的實際值,而在某些*處理器上.TRUE的內部表示。與整數值1完全相同(特別是如果默認邏輯和LOGICAL(C_BOOL)是相同的表示)。 – IanH 2013-02-25 01:53:16

+0

。真。 = -1也是常見的(整數中的所有位設置爲1,其補碼= 2)。 – WaywiserTundish 2013-02-25 10:19:01

回答

6

我不確定是否有內置工具可以做到這一點。我不知道爲什麼ifort接受這個,我的猜測是它是一個編譯器特定的功能。

這個選項,特別是因爲你想這是防彈,是創建你自己的功能。

我沒有測試過這一點,但以下可能的工作:

double precision function logic2dbl(a) 
    logical, intent(in) :: a 

    if (a) then 
    logic2dbl = 1.d0 
    else 
    logic2dbl = 0.d0 
    end if 
end function logic2dbl 
+0

您應該返回值作爲函數名稱:'logic2dbl = ...'。 – sigma 2013-02-24 23:11:32

+0

另外,您應該替換.eq。與.eqv。如果答案在語法上正確,我會接受! – Guillochon 2013-02-24 23:13:31

8

除了寫一個函數來處理這個問題,你也可以直接使用固有的合併功能:b = merge(1.d0, 0.d0, a)。或者您可以編寫一個定義的賦值子例程來完成此操作,以便您可以鍵入b = a

0

在gfortran中,我使用TRANSFER內在的這種類型的工作。 假設一個整數變量my_int然後:

my_int = transfer(.false.,my_int) 

my_int的結果爲0按預期方式。

+2

OP是要求真正的變量... – lodo 2015-04-01 20:46:57

+1

'realvar = transfer(logical,1)'(只需要爲模具設置一個字面整數1)就可以工作(或似乎)。不知道@WaywiserTundish評論是如何移植的 – agentp 2015-04-01 21:02:50