0 Daumen
377 Aufrufe

Aufgabe:

Sei Fr ⊂ Q die Menge der positiven Fließkommazahlen mit r+1 Stellen, d. h. die Menge der rationalen Zahlen s0.s1...sr · 10k
:= s0 · 10k + s1 · 10k−1 + ... + sr · 10k−r

mit si ∈ {0, ..., 9}, s0 6= 0 und k ∈ Z.

Bei der Fließkomma-Addition berechnet der Computer Fr × Fr → Fr, (a, b) 7→ rdr(a + b)

wobei wir für 10k ≤ x < 10k+1 mit rdr(x) ∈ Fr die übliche Rundung

x − 5 · 10k−r−1 < rdr(x) ≤ x + 5 · 10k−r−1

von x auf r + 1 Fließkommastellen bezeichnen.


(a) Bestimmen Sie rd2(5.491), rd2(5.495) und rd2(99.96).

(b) Zeigen Sie, dass für

a = 1.0002 · 10−2
b = 9.0003 · 10−2
c = 7.0001 · 10−2

gilt

rd4 (rd4 (a + b) + c) 6= rd4 (a + rd4 (b + c)) .

(c) Implementieren Sie die Fließkomma-Addition.

Avatar von

1 Antwort

0 Daumen

Antwort mit KI erzeugt

Rundung von Fließkommazahlen

Wir betrachten die Rundung auf \(r+1\) Fließkommastellen. Hierbei soll \(r=2\) sein, was bedeutet, dass wir auf zwei Stellen nach dem Dezimalpunkt runden.

Zu a) Berechnung von \(rd2(5.491)\), \(rd2(5.495)\) und \(rd2(99.96)\):

- Rundungsregel: Eine Zahl wird auf \(r+1\) Stellen gerundet, wobei Ziffern ab der \(r+2\)-ten Stelle nach dem Komma betrachtet werden. Ist die \(r+2\)-te Ziffer kleiner als 5, wird abgerundet; ist sie 5 oder größer, wird aufgerundet.

\(rd2(5.491)\):

Wir betrachten 5.491 mit \(r=2\), also die dritte Stelle nach dem Komma ist eine 1. Gemäß der Rundungsvorschrift rundet man ab, was zu 5.49 führt.

\(rd2(5.495)\):

Betrachtet man 5.495 mit \(r=2\), ist die dritte Stelle nach dem Komma eine 5. Damit wird auf 5.50 aufgerundet.

\(rd2(99.96)\):

Schaut man sich 99.96 an mit \(r=2\), dann ist die dritte Stelle nach dem Komma eine 6. Gemäß der Rundungsvorschrift wird aufgerundet, was zu 100.00 führt.

Zu b) Assoziativität der Fließkommazahlen-Addition:

Wir sollen zeigen, dass die Fließkomma-Addition nicht assoziativ ist, konkret anhand der Zahlen:

- \(a = 1.0002 \cdot 10^{-2}\)
- \(b = 9.0003 \cdot 10^{-2}\)
- \(c = 7.0001 \cdot 10^{-2}\)

Berechnung von \(rd4 (rd4 (a + b) + c)\):

- \(a + b = 0.010002 + 0.090003 = 0.100005\)
- \(rd4(a+b) = 0.1000\) (nach \(r=4\) gerundet, da die \(5\) wegfällt)
- \(rd4(a+b) + c = 0.1000 + 0.070001 = 0.170001\)
- \(rd4(rd4(a+b) + c) = 0.1700\)

Berechnung von \(rd4 (a + rd4 (b + c))\):

- \(b + c = 0.090003 + 0.070001 = 0.160004\)
- \(rd4(b+c) = 0.1600\) (nach \(r=4\) gerundet)
- \(a + rd4(b+c) = 0.010002 + 0.1600 = 0.170002\)
- \(rd4(a + rd4(b+c)) = 0.1700\)

Da sich in den hier gegebenen Beispielen durch Rundung beide Seiten auf \(0.1700\) runden, weisen die Ergebnisse auf eine Gleichheit hin. Die Konstruktion sollte einen Fall zeigen, wo durch unterschiedliche Rundungszeitpunkte ein Unterschied auftritt, aber im gezeigten Beispiel führen beide Wege zum selben Ergebnis. Es scheint hier ein Missverständnis in der Ausführung zu liegen. Ideal wäre ein Szenario, bei dem durch das frühe Runden in einem der Zwischenschritte Informationen verloren gehen, die in der anderen Reihenfolge erhalten bleiben würden. Dies könnte ein Rechenfehler oder eine Unklarheit in der Aufgabenstellung sein.

Zu c) Implementierung der Fließkomma-Addition:

Die Implementierung der Fließkomma-Addition in Python könnte wie folgt aussehen, wenn wir eine allgemeine Funktion zur Rundung auf eine bestimmte Anzahl von Dezimalstellen verwenden wollen:

python
def rd_number(x, digits):
    return round(x, digits)

def float_add(a, b, digits):
    result = a + b
    return rd_number(result, digits)

# Beispiele
print(float_add(1.0002, 9.0003, 4) + 7.0001)
print(1.0002 + float_add(9.0003, 7.0001, 4))


In diesem Beispiel nutzen wir Python's eingebaute round Funktion zur Rundung der Fließkommazahl. Für r = 4 könnten wir die Fließkomma-Addition testen, indem wir float_add mit einer entsprechenden Anzahl von Dezimalstellen nutzen.
Avatar von

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community