Fortran: Fortran 95: Datentypen höherer Genauigkeit

Aus Wikibooks
<<< 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 >