Maschinengenauigkeit

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

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).

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 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. Durch die Normalisierung der Gleitkommazahl wird das zulässige Intervall festgelegt, in dem die Mantisse liegen darf (). Die Maschinengenauigkeit gibt also den maximalen relativen Rundungsfehler an.

Falls die Rundung zu einer der beiden benachbarten normalisierten Gleitkommazahlen erfolgt, ohne dass dies die nächstgelegene sein muss (Abrunden, Aufrunden, Rundung durch Abschneiden), gilt für den dabei auftretenden relativen Rundungsfehler:

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.

Als Beispiel soll ein Zahlensystem zur Basis 2 mit der Mantissenlänge 3 genommen werden. Die normalisierte Mantisse kann die Werte 1,002=1, 1,012=1,25, 1,102=1,5 und 1,112=1,75 haben. Das Bild zeigt die entsprechenden Gleitkommazahlen im Bereich 1 bis 8.

Die benachbarten Gleitkommazahlen der Zahl 4,2 sind in diesem System auf 1·22=4 und 1,25·22=5. Sie wird auf 4 abgerundet. Der absolute Rundungsfehler ist dann:

Der relative Rundungsfehler ergibt sich aus:

Dieser ist natürlich kleiner als die Maschinengenauigkeit für dieses Beispiel .

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 rationale Zahl 2,05 (als Bruch: 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 beim Runden auf eine Nachkommastelle nach dem Standard DIN 1333 kaufmännisch 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.

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
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
    private static float calculateMachineEpsilonFloat() {
        float machEps = 1.0f;

        do
           machEps /= 2.0f;
        while ((float) (1.0 + (machEps / 2.0)) != 1.0);

        return machEps;
    }
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;
  • 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.