Fortran: Fortran 95: Datentypen höherer Genauigkeit
<<< zur Fortran-Startseite | |
<< Fortran 95 | Fortran 2003 >> |
< Verzweigungen und Schleifen | Datenverbund > |
Fortran 95 bietet für die Festlegung von Datentypen höherer Genauigkeit einen neuen Ansatz.
Einfache Variante
[Bearbeiten]Mittels kind
(dt.: Art, Sorte, Gattung, Wesen) kann die Genauigkeit bzw. der Wertebereich eines Datentyps festgelegt werden. Die einfache Variante ist aber system- und compilerabhängig.
datentyp (kind=wert) :: var |
Kurzform:
datentyp (wert) :: var |
Für wert
ist meist (aber nicht immer) die Anzahl der Bytes einzusetzen. Literale eines solchen Datentyps sind mit einem entsprechenden Anhängsel zu kennzeichnen, z.B.:
- 3.141592654_8
- -4.9e55_8
Beispiel:
Fortran 90/95-Code (free source form) |
program bsp implicit none real(kind=8) :: variable ! variable ist nun vom Datentyp "double precision" variable = 1.55555555555_8 write(*,*) variable ! Ausgabe: 1.55555555555000 ! Hier wird nur eine gewöhnliche real-Zahl mit 7 Nachkommastellen ! zugewiesen variable = 1.55555555555 write(*,*) variable ! Ausgabe: 1.55555558204651 end program bsp |
System- und compilerunabhängige Variante
[Bearbeiten]Das kind
-Attribut darf über eine Konstante oder eine benannte Konstante belegt werden. So kann statt
real(kind=8) :: var
auch
integer, parameter :: dp = 8 real(kind=dp) :: var
geschrieben werden. Der entsprechende kind
-Wert ist auch per Funktion ermittelbar. Die Variable var
integer, parameter :: dp = kind(0.0d0) real(kind=dp) :: var
ist in diesem Beispiel somit vom Datentyp double precision
. Das ist schon compilerunabhängig verwendbarer Fortran-Code.
Nachfolgend wird die selected_real_kind(p, r)
-Funktion vorgestellt, die durch Vorgabe der gewünschten Nachkommastellen und/oder des Exponentenmaximalwertes einen potentiell geeigneten kind
-Wert für Gleitkommazahlen ermittelt.
selected_real_kind
[Bearbeiten]integer, parameter :: name = selected_real_kind(anzahl_nachkommastellen, max_exponentenwert) |
Die Funktion selected_real_kind
gibt einen Wert zurück, der alle Gleitkommazahlen mit mindestens anzahl_nachkommastellen
Dezimalstellen Genauigkeit und einem Exponentenbereich von max_exponentenwert
berücksichtigt. Gibt es keinen solchen systemspezifischen Wert, so wird einer der folgenden Werte zurückgegeben:
- -1 ... die geforderte Anzahl an Dezimalstellen ist nicht verfügbar
- -2 ... der Exponentenbereich ist nicht verfügbar
- -3 ... nichts von beidem ist verfügbar
Wird eine solche Konstante mit negativem Wert nachfolgend als kind-Wert bei der Deklaration einer Variablen, Konstanten etc. verwendet, so führt dies in aller Regel zu einer Fehlermeldung bereits beim Kompiliervorgang.
Es ist auch möglich die selected_real_kind
-Funktion mit nur einem Argument aufzurufen. Die Argumente sind mit p
(für precision) bzw. r
(für range) benannt.
Beispiele:
integer, parameter :: dp = selected_real_kind(r=60)
integer, parameter :: dp = selected_real_kind(p=15)
integer, parameter :: ultrap = selected_real_kind(1000, 5000) ! liefert höchstwahrscheinlich ! die negative Zahl -3
Variablendeklaration
[Bearbeiten]real (kind=name) :: variable |
Kurzform:
real (name) :: variable |
Beispiel:
integer, parameter :: dp = selected_real_kind(r=60) real(kind=dp) :: var
Konstanten
[Bearbeiten]zahl_name |
Literale eines solchen Datentyps sind mit dem im Programmcode festgelegten charakteristischen Anhängsel zu kennzeichnen, z.B.:
- 3.141592654_dp
- -4.9e55_dp
Beispiel
[Bearbeiten]Fortran 90/95-Code (free source form) |
program bsp implicit none integer, parameter :: dp = selected_real_kind(15, 300) real(kind=dp) :: variable variable = 1.5555555555_dp / 2_dp write(*,*) variable ! Ausgabe: 0.777777777750000 write(*,*) kind(variable) ! Ausgabe: 8 end program bsp |
<<< zur Fortran-Startseite | |
<< Fortran 95 | Fortran 2003 >> |
< Verzweigungen und Schleifen | Datenverbund > |