2014-11-14 218 views

回答

-2

您可以複製的單精度複雜的變量,或 您還可以使用cmplxdcmplx功能:

program test 
    complex*16:: a 
    complex :: b 
    a = (1.d0, 2.d0) 
    b = a 

    print *, a, b 
    print *, cmplx(a), dcmplx(b) 
end 

輸出:

(1.00000000000000,2.00000000000000) (1.000000,2.000000) 
(1.000000,2.000000) (1.00000000000000,2.00000000000000) 
+3

我不得不說,現在我更喜歡Valdimir的解決方案,而且我應該注意複雜的* 16不是標準的Fortran - 同樣的機制解決了現代Fortran中的這種問題 – 2014-11-14 15:05:04

6

使用通用REAL()所有實際數字轉換,儘管SNGL()也可用於一個特定情況:

integer, parameter :: sp = kind(1e0), dp = kind(1d0) 

    real(x) !converts to the default kind, which is the single precision 
      !sngl(x) does the same thing 
    real(x, sp) ! converts to the kind sp (single precision) 
    real(x, dp) ! converts to the kind dp (double precision) 

複雜的是一樣的,但使用CMPLX()

cmplx(x) !converts to the default kind, which is the single precision 
    cmplx(x, sp) ! converts to the kind sp (single precision) 
    cmplx(x, dp) ! converts to the kind dp (double precision) 

在分配的轉換是隱式的,你不必(但可以)使用這些顯式轉換函數。

單精度和雙精度的整體概念已經過時並被Fortran 90 kinds所取代。

+0

我更喜歡'use iso_fortran_env'和'整數,參數:: sp = real32,dp = real64' – steabert 2014-11-14 14:29:37

+2

我也是,但是這會改變語義有點我試圖保持它作爲默認和雙。 – 2014-11-14 14:42:40