0 Daumen
470 Aufrufe

ich fange gerade an Python zu lernen und habe eine kurze Frage zu der "rechenweise" von Python.

Wenn ich Brüche eintippe, z.B. $$\frac{\frac{1}{2}-\frac{1}{3}}{\frac{1}{6}}$$müsste ja eigentlich 1 rauskommen, trotzdem bekomme ich einen Bruch heraus, der zwar sehr nah an der 1 dran liegt aber nicht 1 ist, warum?


(Das ist das Ergebnis, das Python ausgibt:) $$\frac{18014398509481984}{18014398509481983}$$

VG

Avatar von

1 Antwort

0 Daumen
 
Beste Antwort

Hallo,

das liegt wahrscheinlich weniger am Python, sondern vielmehr an der Applikation, die Du gerade benutzt. Diese rechnet anscheinend nicht mit den rationalen Zahlen wie Du sie eingibst, sondern wandeln diese zunächst in die rechnerinterne Zahlendarstellung um. Das sind zwar auch rationale Zahlen, aber nur solche die im Nenner eine Potenz von 2 stehen haben.

Und dabei geschehen zwangsläufig Fehler. Daran würde man auch nichts ändern, wenn man mit einer größeren Genauigkeit rechnet. Danach wird die eigentliche Berechnung durchgeführt und dann wird das Ergebnis wieder in eine rationale Zahl mit einem kleineren Nenner gewandelt. Wie genau das geschieht, hängt von der von Dir verwendeten Applikation ab.

Auch Phyton muss für den letzten Schritt - also die Ausgabe als rationale Zahl - eine Funktion aufrufen, und die Frage ist: was macht diese Funktion genau?

Avatar von 48 k

Die Rechnung oben in Binärdarstellung nach der Norm IEEE-754 ergibt im Ergebnis 0x3ff0000000000001. Die letzte Ziffer 1 ist der Unterschied zum korrekten Ergebnis \(1\). Dieses letzte Bit liegt im Allgemeinen 'unter der Wahrnehmungsschwelle' - d.h. wenn der Rechner dies in eine Ausgabe umwandelt, auf z.B. 14 Stellen genau, so wird eine \(1\) erscheinen.

Die Ausgabefunktion, die Du verwendest, ist anscheinend noch genauer. Es ist $$\text{0x3ff0000000000001}_{IEE-754} \approx \text{1.0000000000000002}$$

vielen Dank für deine Antwort. ich hätte wahrscheinlich sagen sollen, wie ich die Brüche in Python dargestellt habe. Ich habe dafür die Schreibweise Rational(1/2).

Aber wie meinst du das mit der Zweierpotenz?

Würde Python dann z.B. 1/\( \sqrt{2} \)^2 rechnen, um 1/2 "auszurechnen"?

Würde Python dann z.B. \(1/\sqrt{2} ^2\) rechnen, um 1/2 "auszurechnen"?

Nein - rationale Zahl mit Zweierpotenz im Nenner heißt: jede Zahl \(x\) wird im Prinzip dargestellt als $$x = \pm m \cdot 2^e, \quad m \in \mathbb N, \space e \in \mathbb Z$$wobei natürlich \(m\) und \(e\) auf den Darstellungsbereich der Zahl beschränkt sind - will sagen: das geht nicht bis \(\infty\)!

Somit ist $$\frac 12 = 0,1_2 = + 1 \cdot 2^{-1}$$das kann exakt dargestellt werden. Aber $$\frac 13 =  0,\overline{01}_2 \approx + 6004799503160661 \cdot 2^{-54} \lt \frac 13$$ (wenn ich mich nicht verrechnet habe) der Unterschied macht sich erst bei der 17.Dezimalstelle hinter dem Komma bemerkbar.

D.h. die Zahl im Rechner, die für 1/3 steht, ist etwas zu klein, genauso 1/6, was sich gegenüber 1/3 nur in dem Wert für \(e\) äußert. Damit ist in dem von Dir angegebenen Bruch der Zähler etwas zu groß und der Nenner etwas kleiner als der exakte Wert. Nach der Division der Werte gibt es dann den von Dir gefundenen Fehler.

Vielen Dank:)

Ein anderes Problem?

Stell deine Frage

Ähnliche Fragen

Willkommen bei der Mathelounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community