2014-11-14 2 views

ответ

-2

Вы можете сделать копию в комплексной переменной с одинарной точностью, или вы также можете использовать cmplx и dcmplx функции:

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

Я должен сказать, что в настоящее время я бы предпочел решение Валдимира, а также я должен отметить, что сложный * 16 не является стандартным Fortran - снова механизм типов решает это в modor Fortran –

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' и 'integer, parameter :: sp = real32, dp = real64' – steabert

+2

Я тоже, но это немного меняет семантику, я старался сохранить ее как по умолчанию, так и двойной. –

Смежные вопросы