2016-03-27 8 views
1

Laut der Dokumentation.Präzision und Art in cmplx()

cmplx(x,y) gibt standardmäßig die einfache Genauigkeit an.

Aber es hat kind Parameter

CMPLX (x, y, Art) den komplexen Wert, dessen Realteil ist REAL (x, Art) ist und dessen imaginärer Teil ist REAL (y, Art).

Aber ich versuchte, diese

print*,cmplx(1.12,2.34,kind(0D0)) 

es

(1.12000000476837,2.33999991416931) 

gibt es complex(8), aber die Präzision verloren. In diesem Fall kann ich einfach (1.12D0,2.23D0) verwenden. Aber ich frage mich, was ist der Punkt kind in cmplx?

Antwort

2

Das Problem ist, dass die Konstanten einfache Genauigkeit sind, obwohl sie verwendet werden, um eine Variable mit doppelter Genauigkeit zu definieren. Sie müssen die Genauigkeit der Konstanten angeben. Das folgende Beispielprogramm verwendet die Art real64, die 64 Bits bedeutet (das heißt, double precision), von der ISO Fortran Umgebung von Fortran 2003, dies zu zeigen:

program test 

    use, intrinsic :: ISO_FORTRAN_ENV 

    print*,cmplx(1.12,2.34,kind(0D0)) 
    print*,cmplx(1.12_real64,2.34_real64,kind(0.0_real64)) 

end program test 

, die Sie mit 1.23D0, 2.34D0 erreicht. Die kind-Option wäre in anderen Kontexten nützlich, z. B. Ändern des Typs einer Variablen, die an eine Unterroutine übergeben wird, um dem erwarteten Argument zu entsprechen: call SomeSub (cmplx (1.12, 2.34, kind (0D0)) würde dem Argument einer Subroutine SomeSub entsprechen, die ein komplexes Argument mit doppelter Genauigkeit erwartet.

+0

Vielen Dank für Ihre Antwort. Ist 'real64' tragbarer als' D0'? – user15964