MATHEMATISCHES INSTITUT DER UNIVERSITÄT MÜNCHEN Dr. W. Spann, G. Kleen SS 2023

Programmieren I für Studierende der Mathematik

Aufgabe 4

Aus der Gleichung ln(a) = lim_{h→0} \frac{a^{h} − 1}{h} ergibt sich durch Wahl der Folge h_{n} = \frac{1}{2^{n}} (n ∈ ℕ)

ln(a) = lim_{n→∞} 2^{n} ( ^{2^{n}} \sqrt{a} − 1) = lim_{n→∞} 2^{n} \frac{a − 1}{∏_{k=1}^{n} (1 + ^{2^{k}} \sqrt{a})} (falls a > 0)

und damit Verfahren, mit denen der natürliche Logarithmus durch wiederholtes Ziehen der Quadratwurzel berechnet werden kann. Die zweite Gleichung – sie vermeidet das numerische

Problem der Auslöschung – folgt aus der Umformung x^{2^{n}} −1 = (x−1) ∏_{k=0}^{n−1}(x^{2^{k}} +1) mit x = ^{2^{n}} \sqrt{a}.

(a) Geben Sie im Fall a > 0 für beide Verfahren die Folge der Näherungen an ln(a) in einer Tabelle aus und zum Vergleich auch den mit der Standardfunktion berechneten Wert von ln(a). Brechen Sie die Berechnung ab, wenn | ^{2^{n}} \sqrt{a} − 1| ≤ ε, wobei ε in der Größenordnung der Maschinengenauigkeit des verwendeten Gleitpunkttyps liegen soll.

Die Berechnung von ^{2^{k}} \sqrt{a} soll nicht mit Hilfe der Funktionen pow bzw. exp und log erfolgen, sondern durch wiederholtes Wurzelziehen. Entsprechendes gilt für die Auswertung von 2^{n}, hier kann (aber muss nicht) die Funktion ldexp zum Einsatz kommen.

(b) Erstellen Sie eine Funktion mylog mit einem Parameter a, die für a > 0 den Logarithmus mit Hilfe der zweiten Gleichung berechnet. Für a = 0 soll der Funktionswert −∞ und für a < 0 NaN (”not a number“) zurückgegeben werden. Zusätzlich soll für a = 0 ein Wertebereichsfehler und für a < 0 ein Definitionsbereichsfehler mittels des errno-Mechanismus gesetzt werden. Geben Sie im Hauptprogramm zusätzlich und durch eine Leerzeile von den Ergebnissen von (a) getrennt, jeweils a, den Wert der Standardfunktion ln a bzw. mylog(a) und die entsprechende Fehlermeldung aus, sofern ein Fehler mittels des errno-Mechanismus gesetzt wird.

(Hinweis: numeric_limits<double>::quiet_NaN() liefert NaN.)

Verwenden sie für alle auszugebenden Größen ein Exponentialformat mit 15 Nachkommastellen und achten Sie auf tabellarische Ausgabe.

Rechnen Sie folgende Beispiele:

(i) 2 (ii) 0.36789 (iii) 1000000000 (iv) 0.99999999
(v) 1 (vi) 0.0  (vii) −0.0  (viii) −1

Bearbeitungszeitraum: bis Freitag, 2.6.2023, 12^{00}