This is documentation for Mathematica 4, which was
based on an earlier version of the Wolfram Language.
View current documentation (Version 11.2)

 Documentation /  Mathematica /  Das Mathematica Buch /  Höhere Mathematik in Mathematica /  Zahlen /

Numerische PräzisionZahlen mit Maschinengenauigkeit

3.1.5 Zahlen mit beliebiger Präzision

Bei der Durchführung von Berechnungen mit Zahlen beliebiger Präzision verfolgt Mathematica die Präzision fortlaufend. Abhängig von der Präzision der Eingabe versucht Mathematica, Ergebnisse mit höchstmöglicher Präzision zu liefern.

Mathematica behandelt Zahlen mit beliebiger Präzision als Repräsentanten der Werte von Größen, bei denen eine bestimmte Anzahl der Stellen bekannt und die restlichen unbekannt sind. Im allgemeinen wird angenommen, daß eine Zahl x mit beliebiger Präzision Precision[x] Stellen hat, die genau bekannt sind, gefolgt von einer unendlichen Anzahl Stellen, die vollständig unbekannt sind.

Bei der Durchführung einer Berechnung verfolgt Mathematica, welche Stellen des Ergebnisses von unbekannten Stellen der Eingabe beeinflußt sein könnten. Mathematica legt die Präzision des Ergebnisses so fest, daß betroffene Stellen nicht verwendet werden. Dieses Verfahren stellt sicher, daß alle von Mathematica angegebenen Stellen korrekt sind, wie auch immer die möglichen Werte der unbekannten Stellen sein mögen.

Dies evaluiert und versucht, ein Ergebnis mit 30-stelliger Präzision zu erhalten.

In[1]:= N[Gamma[1/7], 30]

Out[1]=

In diesem Fall hat das Ergebnis eine Präzision von exakt 30 Stellen.

In[2]:= Precision[%]

Out[2]=

Wenn Ihre Eingabe nur bis auf wenige Stellen präzise ist, kann Mathematica keine Ausgabe so hoher Präzision liefern.

In[3]:= N[Gamma[0.142], 30]

Out[3]=

Wenn Sie wollen, daß Mathematica 0.142 als exakt 142/1000 betrachtet, müssen Sie dies explizit angeben.

In[4]:= N[Gamma[142/1000], 30]

Out[4]=

Bei vielen Berechnungen wird die Präzision der erhaltenen Ergebnisse durch „Rundungsfehler" zunehmend geringer. Ein typischer Fall tritt bei der Subtraktion zweier eng benachbarter Zahlen auf. Das Ergebnis, das Sie erhalten, hängt von den Stellen höherer Ordnung jeder Zahl ab und verfügt in der Regel über weniger präzise Stellen als die ursprünglichen Zahlen.

Beide Zahlen werden mit einer Präzision von rund 20 Stellen eingegeben, das Ergebnis hat aber eine viel geringere Präzision.

In[5]:= 1.11111111111111111111 -
1.11111111111111111000

Out[5]=

Durch Hinzufügen von extra Ziffern zu nur einer der Zahlen erreichen Sie nicht ohne weiteres, daß das Ergebnis mehr Stellen enthält.

In[6]:= 1.11111111111111111111345 -
1.11111111111111111000

Out[6]=

Die Präzision in der Ausgabe einer Funktion kann auf komplizierte Weise von der Präzision in der Eingabe abhängen. Funktionen, die stark variieren, liefern in der Regel weniger präzise Ausgaben, da die Variation der Ausgabe bei Ungenauigkeiten der Eingabe größer ist. Funktionen hingegen, die fast konstant sind, können in der Ausgabe präziser sein als in ihrer Eingabe.

Funktionen wie Sin, die stark variieren, liefern in der Regel Ausgaben, die weniger präzise sind als ihre Eingaben.

In[7]:= Sin[111111111.0000000000000000]

Out[7]=

Hier wird mit 20-stelliger Präzision evaluiert.

In[8]:= N[Exp[-40], 20]

Out[8]=

Das Ergebnis, das Sie nach der Addition der exakten ganzen Zahl 1 erhalten, hat eine höhere Präzision.

In[9]:= 1 + %

Out[9]=

Sie sollten sich bewußt machen, daß unterschiedliche Berechnungsarten am Ende zu Ergebnissen sehr verschiedener Präzision führen können. Wenn Sie einmal Präzision während einer Berechnung verloren haben, ist es im Grunde unmöglich, sie wiederzugewinnen. Durch den Verlust an Präzision verlieren Sie tatsächlich Information über Ihr Ergebnis.

Hier ist eine 40-stellige Zahl, die nahe bei 1 liegt.

In[10]:= x = N[1 - 10^-30, 40]

Out[10]=

Addition von 1 ergibt eine andere 40-stellige Zahl.

In[11]:= 1 + x

Out[11]=

Die ursprüngliche Präzision bleibt erhalten.

In[12]:= Precision[%]

Out[12]=

Wenn man 1 + x so berechnet, geht Präzision verloren.

In[13]:= (x^2 - 1) / (x - 1)

Out[13]=

Das Ergebnis, das so erhalten wird, hat eine recht niedrige Präzision.

In[14]:= Precision[%]

Out[14]=

Die Tatsache, daß verschiedene Wege derselben Berechnung Ihnen unterschiedliche numerische Antworten geben kann, bedeutet unter anderem, daß Vergleiche zwischen Gleitpunktzahlen mit Vorsicht zu behandeln sind. Bei dem Test, ob zwei reelle Zahlen „gleich" sind, ermittelt Mathematica im Grunde ihre Differenz und testet, ob das Ergebnis innerhalb der angegebenen Präzision „konsistent mit Null" ist.

Diese Zahlen sind gleich innerhalb der angegebenen Präzision.

In[15]:= 3 == 3.000000000000000000

Out[15]=

Die internen Algorithmen, die Mathematica zur Evaluierung mathematischer Funktionen einsetzt, sind so konstruiert, daß soviel Präzision wie möglich erhalten bleibt. In den meisten Fällen liefern eingebaute Mathematica-Funktionen Ergebnisse mit soviel Präzision, wie sich aufgrund der Eingabe rechtfertigen läßt. Manchmal ist dies jedoch einfach unpraktisch, und Mathematica wird Ergebnisse liefern, die eine niedrigere Präzision haben. Wenn eine Eingabe höherer Präzision vorgegeben wird, wird Mathematica in seinen internen Berechnungen höhere Präzision benutzen, und man wird gewöhnlich ein Ergebnis höherer Präzision erhalten können.

Numerische Evaluierung

Wenn Sie mit einem Ausdruck beginnen, der nur ganze Zahlen und andere exakte numerische Größen enthält, dann wird N[ausdr, n] in beinahe allen Fällen ein Ergebnis mit einer Präzision von n Stellen liefern können. Sie sollten sich jedoch bewußt machen, daß Mathematica dafür mitunter interne Zwischenberechnungen mit einer sehr viel höheren Präzision durchführen muß.

Die globale Variable $MaxExtraPrecision spezifiziert, wieviele zusätzliche Stellen in derartigen Zwischenberechnungen verwendet werden sollen.

Mathematica erhöht in diesem Fall automatisch die Präzision, die es intern verwendet, um die korrekte Antwort zu erhalten.

In[16]:= N[Sin[10^40], 30]

Out[16]=

Mit der Voreinstellung $MaxExtraPrecision=50 kann Mathematica in diesem Fall die korrekte Antwort nicht erhalten.

In[17]:= N[Sin[10^100], 30]

Out[17]=

Die Präzision ist Null; dies zeigt an, daß nicht erwartet werden kann, daß irgendeine Stelle korrekt ist.

In[18]:= Precision[%]

Out[18]=0

Dies weist Mathematica an, in seinen internen Berechnungen mehr Stellen zu verwenden.

In[19]:= $MaxExtraPrecision = 100

Out[19]=

Nun ergibt sich die korrekte Antwort.

In[20]:= N[Sin[10^100], 30]

Out[20]=

Dies setzt $MaxExtraPrecision wieder gleich dem Vorgabewert.

In[21]:= $MaxExtraPrecision = 50

Out[21]=

Mathematica sichert das vorige Ergebnis und liefert hier so immer noch die korrekte Antwort.

In[22]:= N[Sin[10^100], 30]

Out[22]=-0.37237612366127668826208669555

Auch wenn Sie Berechnungen durchführen, die exakte Ergebnisse liefern, wird Mathematica gelegentlich für einige interne Berechnungen Gleitpunktzahlen verwenden, deshalb kann der Wert von $MaxExtraPrecision einen Einfluß haben.

Mathematica arbeitet hier mit Gleitpunktzahlen.

In[23]:= Sin[Exp[100]] > 0

Out[23]=

Mit dem Vorgabewert von $MaxExtraPrecision gelangt Mathematica zu keinem Ergebnis.

In[24]:= Sin[Exp[200]] > 0

Out[24]=

Durch eine temporäre Änderung von $MaxExtraPrecision gelangt Mathematica zum Ergebnis.

In[25]:= Block[{$MaxExtraPrecision = 100},
Sin[Exp[200]] > 0]

Out[25]=

Globale Parameter zur Präzision

Wenn Mathematica die mögliche Wirkung unbekannter Stellen in beliebig präzisen Zahlen ausarbeitet, nimmt es stets an, daß diese Stellen in verschiedenen Zahlen vollständig unabhängig voneinander sind. Obwohl diese Annahme in einem Ergebnis niemals eine zu hohe Präzision liefert, kann sie doch zu einem unnötigen Verlust an Präzision führen.

Insbesondere, wenn zwei Zahlen bei einer Berechnung auf dieselbe Art erzeugt werden, können einige der unbekannten Stellen gleiche Ziffern enthalten. Wenn diese Zahlen dann zum Beispiel subtrahiert werden, können sich die unbekannten Ziffern aufheben. Wegen der Annahme, daß die unbekannten Stellen immer unabhängig sind, wird Mathematica jedoch derartige Aufhebungen nicht erkennen.

Hier ist eine Zahl, die mit 20-stelliger Präzision berechnet wurde.

In[26]:= delta = N[3^-30, 20]

Out[26]=

Die Größe 1 + delta hat 34-stellige Präzision.

In[27]:= Precision[1 + delta]

Out[27]=

Diese Größe hat ebenfalls nur 34-stellige Präzision, da Mathematica annimmt, daß die unbekannten Stellen in jeder Zahl delta unabhängig sind.

In[28]:= Precision[(1 + delta) - delta]

Out[28]=

Numerische Algorithmen verlassen sich manchmal auf Aufhebungen zwischen unbekannten Stellen in verschiedenen Zahlen und erhalten so Ergebnisse höherer Präzision. Wenn man davon ausgehen kann, daß sich bestimmte unbekannte Stellen am Ende aufheben, dann kann man explizit willkürliche Stellen anstelle der unbekannten einführen. Diese willkürlichen Stellen kann man in der Berechnung mitführen, schließlich läßt man sie sich aufheben und erhält so ein Ergebnis höherer Präzision.

Funktionen zur Modifikation von Präzision und Genauigkeit

Dies fügt delta 10 „willkürliche" Stellen hinzu.

In[29]:= delta = SetPrecision[delta, 30]

Out[29]=

Die hinzugefügten Stellen heben sich nun auf.

In[30]:= (1 + delta) - delta

Out[30]=

Die Präzision des Ergebnisses beträgt jetzt 44 statt 34 Stellen.

In[31]:= Precision[%]

Out[31]=

SetPrecision fügt Stellen hinzu, die im Stellenwertsystem zur Basis 2 Null sind. Manchmal speichert Mathematica bei einer Zahl mit beliebiger Präzision einige Stellen mehr als es anzeigt. In solchen Fällen benutzt SetPrecision diese extra Stellen, ehe es Nullen hinzufügt.

Dies erzeugt eine Zahl mit einer Präzision von 40 Dezimalstellen. Die extra Stellen werden durch die Wandlung zur Basis 10 erzeugt.

In[32]:= SetPrecision[0.300000000000000, 40]

Out[32]=

Durch die globale Zuweisung $MinPrecision = n können Sie im Grunde SetPrecision[ausdr, n] bei jedem Berechnungsschritt anwenden. Dies bedeutet: Auch wenn die Anzahl korrekter Stellen in einer Zahl beliebiger Präzision kleiner als n wird, wird die Zahl immer so aufgefüllt, daß sie n Stellen hat.

Wenn Sie $MaxPrecision = n sowie $MinPrecision = n setzen, dann können Sie erreichen, daß alle Zahlen mit beliebiger Präzision eine feste Präzision von n Stellen haben. So wird im Grunde erreicht, daß Mathematica Zahlen mit beliebiger Präzision sehr ähnlich wie Maschinenzahlen behandelt—aber mit mehr Stellen Präzision.

Beim Rechnen mit fester Präzision können einige Berechnungen effizienter werden; ohne sorgfältige Analyse kann man aber niemals sicher wissen, wie viele Stellen in den Ergebnissen korrekt sind.

Hier ist eine kleine Zahl mit 20 Stellen Präzision.

In[33]:= k = N[Exp[-60], 20]

Out[33]=

Mit Mathematicas normaler Arithmetik geht dies sehr gut.

In[34]:= Evaluate[1 + k] - 1

Out[34]=

Hiermit wird Mathematica angewiesen, Arithmetik mit fester Präzision einzusetzen.

In[35]:= $MinPrecision = $MaxPrecision = 20

Out[35]=

Die ersten paar Stellen sind korrekt, die restlichen sind aber falsch.

In[36]:= Evaluate[1 + k] - 1

Out[37]=

Numerische PräzisionZahlen mit Maschinengenauigkeit