Maschinengenauigkeit

Van Wikipedia, de gratis encyclopedie

Die Maschinengenauigkeit ist ein Maß für den Rundungsfehler, der bei der Rechnung mit Gleitkommazahlen auftritt. Andere gebräuchliche Bezeichnungen für die Maschinengenauigkeit sind Rundungseinheit (unit roundoff) und Maschinenepsilon (bzw. macheps).

Beschreibung[Bearbeiten | Quelltext bearbeiten]

Aufgrund der endlichen Mantisse in der Gleitkommadarstellung lassen sich Zahlen auf einem Computer nicht beliebig genau darstellen. Es muss gerundet werden. Statt verwendet der Computer die Zahl für die weitere Rechnung.

Falls die Rundung zur nächstgelegenen normalisierten Gleitkommazahl erfolgt (kaufmännisches Runden oder mathematisches Runden), gilt für den dabei auftretenden relativen Rundungsfehler:

Dabei wird als Maschinengenauigkeit bezeichnet. ist die Basis der Gleitkommadarstellung und die Mantissenlänge. Die Maschinengenauigkeit gibt also den maximalen relativen Rundungsfehler an.

Falls die Rundung zu einer der beiden benachbarten normalisierten Gleitkommazahlen erfolgt (Abrunden, Aufrunden, Rundung durch Abschneiden), gilt für den dabei auftretenden relativen Rundungsfehler:

Bemerkungen[Bearbeiten | Quelltext bearbeiten]

Die angegebene Abschätzung für den Rundungsfehler gilt nur für normalisierte Gleitkommazahlen. Nähert man sich der Zahl Null, so kann der relative Rundungsfehler auch größer werden und steigt bis auf 100 % (für ).

Es sind auch andere Bezeichnungen für die Maschinengenauigkeit gebräuchlich. Insbesondere sind dies Rundungseinheit (unit roundoff) und manchmal auch Maschinenepsilon (bzw. macheps), wobei der Begriff Maschinenepsilon auch für den maximalen relativen Abstand zweier benachbarter normalisierter Gleitkommazahlen verwendet wird. Dieser hat die Größe . Daraus ergibt sich die Abschätzung des relativen Rundungsfehlers bei Rundung zu einer benachbarten normalisierten Gleitkommazahl: Falls etwa im schlechtesten Fall knapp größer ist als eine normalisierte Gleitkommazahl und durch Aufrundung die nächstgrößere normalisierte Gleitkommazahl ist, so ist der relative Abstand von zu kleiner als der maximale relative Abstand zweier benachbarter normalisierter Gleitkommazahlen.

Beispiel[Bearbeiten | Quelltext bearbeiten]

Als Beispiel soll ein Zahlensystem zur Basis 2 mit der Mantissenlänge 3 genommen werden. Das Bild zeigt die entsprechenden Gleitkommazahlen im Bereich 1 bis 8.

Die Zahl 4,2 wird in diesem System auf 4 gerundet werden. Der absolute Rundungsfehler ist dann:

Der relative Rundungsfehler ergibt sich aus:

Dieser ist natürlich kleiner als die Maschinengenauigkeit für dieses Beispiel . Die Maschinengenauigkeit ist also im Allgemeinen eine sogenannte Worst-Case-Abschätzung.

Bedeutung[Bearbeiten | Quelltext bearbeiten]

Das Ergebnis einer Rechnung ist wesentlich von der Maschinengenauigkeit abhängig. Zunächst können die Eingangsdaten nicht beliebig genau dargestellt werden. Daraus resultiert ein Fehler im Ergebnis. Dieser Fehler wird über die Kondition des Problems beschrieben. Multipliziert man die Kondition mit der Maschinengenauigkeit erhält man eine Abschätzung dieses Fehlers. Die zweite Fehlerquelle entsteht aus der Ungenauigkeit des verwendeten Algorithmus. Diese Fehlerverstärkung wird als Stabilität bezeichnet. Auch hierfür lässt sich manchmal die entsprechende Stabilitätskonstante angeben. Ein schlecht konditioniertes Problem oder ein mäßig stabiler Algorithmus erfordern also eine hohe Maschinengenauigkeit oder eine geeignete Problemumformulierung beziehungsweise die Verwendung eines stabileren Algorithmus.

Maschinengenauigkeit in der Praxis[Bearbeiten | Quelltext bearbeiten]

Heutige Computer arbeiten meist nach IEEE 754. Die Maschinengenauigkeit für die dabei verwendeten Datentypen ist für einfache Genauigkeit (single precision) und für doppelte Genauigkeit (double precision).

Scheinbare Rundungsfehler[Bearbeiten | Quelltext bearbeiten]

Nach IEEE 754 kann beispielsweise die Gleitkommazahl 2,05 (ganzrational = 205/100) bei 64-Bit-Systemen (im Standard IEEE 754 als "binary64" bezeichnet) nicht exakt, sondern nur mit der Maschinengenauigkeit gespeichert werden. Stattdessen wird deswegen der nächstbeste speicherbare Gleitkommawert mit 16 Nachkommastellen 2,0499999999999998 verwendet, der nach dem Standard DIN 1333 kaufmännisch mit einer Nachkommastelle auf 2,0 abgerundet wird, obwohl der ursprüngliche Wert von 2,05 auf 2,1 aufgerundet würde.

Beim Austausch von Zahlenwerten mit anderen Computern oder Datenbanken sowie beim dauerhaften Speichern in Dateien, wird in der Regel der mit der Maschinengenauigkeit binär codierbare Zahlenwert verwendet. Dies kann für die Anwender zu nicht offensichtlichen Rundungsfehlern führen, weil viele Anwendungsprogramme in ihren Benutzerschnittstellen diesen Wert in den entsprechenden Textfeldern unter Berücksichtigung des epsilon-Wertes für die jeweilige Maschinengenauigkeit mit reduzierter Anzahl von Nachkommastellen auf 2,05 gerundet und ohne die Nullen am Ende nur scheinbar korrekt anzeigen.

Näherungsweise Berechnung[Bearbeiten | Quelltext bearbeiten]

In der Praxis wird die Maschinengenauigkeit als kleinste positive Gleitkommazahl ermittelt, für die auf der betreffenden Maschine die Bedingung

erfüllt ist. Da die Zwischenergebnisse der folgenden Programme aufgrund der Verwendung von 2er Potenzen, bzw. 1.0 + 2er Potenz, entweder exakt oder gerade nicht mehr darstellbar sind, berechnen die folgenden Programme den relativen Abstand zweier Gleitkommazahlen. Die Maschinengenauigkeit bei symmetrischer Rundung ergibt sich dann aus der Hälfte des Ergebnisses.

Approximation in Fortran[Bearbeiten | Quelltext bearbeiten]

Ab Fortran 90 kann die Maschinengenauigkeit durch Aufruf der Intrinsic-Funktion epsilon() berechnet werden. Für Fortran 77 und früher können folgende Statements verwendet werden (Variable vom Typ real):[1]

   UMACHN = 1.0 10 UMACHN = 0.5*UMACHN    IF ( 1.0 + 0.5*UMACHN .GT. 1.0 ) GOTO 10 

Approximation in BASIC[Bearbeiten | Quelltext bearbeiten]

10 E=1.0 20 E=0.5*E 30 IF 1.0 + 0.5*E > 1.0 THEN GOTO 20 40 PRINT "EPSILON=" E 

Approximation in Java[Bearbeiten | Quelltext bearbeiten]

    private static float calculateMachineEpsilonFloat() {         float machEps = 1.0f;          do            machEps /= 2.0f;         while ((float) (1.0 + (machEps / 2.0)) != 1.0);          return machEps;     } 

Approximation in Pascal[Bearbeiten | Quelltext bearbeiten]

function machine_epsilon: double; var one_plus_halfepsilon: double; begin   Result := 1.0;   repeat     Result := 0.5 * Result;     { damit das Ergebnis der Addition garantiert den richtigen Typ hat,       wird es einer Variablen zugewiesen }     one_plus_halfepsilon := 1.0 + 0.5 * Result;   until one_plus_halfepsilon <= 1.0; end; 

Literatur[Bearbeiten | Quelltext bearbeiten]

  • A. Kielbasinski, H. Schwetlick: Numerische lineare Algebra. Deutscher Verlag der Wissenschaften, 1988
  • Alfio Quarteroni, Riccardo Sacco, Fausto Saleri: Numerische Mathematik 1. Springer-Verlag, 2002, ISBN 3-540-67878-6

Einzelnachweise[Bearbeiten | Quelltext bearbeiten]

  1. Gisela Engeln-Müllges, Fritz Reutter: Formelsammlung zur Numerischen Mathematik mit Standard-FORTRAN-77-Programmen. 5. Auflage. Bibliographisches Institut, Zürich 1986, ISBN 3-411-03125-5.