Rechenungenauigkeiten vermeiden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
muhazz
User
Beiträge: 37
Registriert: Donnerstag 1. April 2010, 11:58

Hallo liebe Python-Community,

ich möchte möglichst präzise einige Iterationen von verschiedenen Funktionen berechnen.
Wenn ich das aber "ganz normal" programmiere, werden die Werte schnell sehr ungenau, vor allem bei chaotischen Iterationen wie f(z)=z^2+c.
Hinzu kommt, dass ich die Iterationen im Bereich der komplexen Zahlen durchführen möchte. Ich kann natürlich Real- und Imaginärteil getrennt betrachten und als Reelle Zahlen behandeln, aber es wäre wesentlich bequemer (und vielleicht auch schneller?), wenn ich den Datentyp complex benutzen könnte.

Welche Möglichkeiten habe ich denn, die Genauigkeit der Rechnungen zu erhöhen?
Ich habe mich schon ein bisschen umgehört und von bestimmten Modulen (decimal, fixed point) gelesen und von BCD und long-Datentypen, aber ich muss zugeben, ich habe die Artikel nicht wirklich verstanden und auch keine Ahnung, wie ich davon etwas anwenden soll.
Ich bin mir auch nicht sicher, ob mir irgendwas davon überhaupt weiterhelfen kann...

Viele Grüße,
muhazz
muhazz
User
Beiträge: 37
Registriert: Donnerstag 1. April 2010, 11:58

Hmm, mit decimal hatte ich grad ein wenig rumgespielt. Aber auch mit cmath sehe ich noch keine Möglichkeit, eine komplexe Zahl als Decimal zu benutzen. Geht auch nicht, oder?
So wie ich das sehe, müsste ich meine komplexe Zahl z in Real- und Imaginärteil zerlegen und diese entsprechend verrechnen.

Was bedeutet denn die Ausgabe: 0E-27
Sie wurde mir von einer Rechnung mit Decimal-Daten geliefert.

Edit: Meine Vermutung wäre 0*10^(-27).
BlackJack

@muhazz: Das bedeutet 0 * 10^-27, also wahrscheinlich eine seeehr kleine Zahl. :-)

Du kannst Dir mit `decimal`-Zahlen ja eine eigene `Complex`-Klasse basteln wenn Du möchtest.

Auf Deine ursprüngliche Frage gibt es IMHO keine einfache Antwort weil es immer darauf ankommt was Du genau machen willst. Normalerweise möchte man auch nicht 100% verlustfrei arbeiten, sondern die Abweichung in einem vernünftigen Rahmen halten. Dazu muss man sich allerdings intensiver mit der Darstellung von Zahlen im Rechner und den möglichen Arten von Ungenauigkeiten auskennen. Also die Artikel die Du nicht verstanden hast müsstest Du verstehen lernen. Das ist kein ganz triviales Thema.

Auch `decimal` hat seine Grenzen, zum Beispiel bei Brüchen die intern nicht endlich darstellbar sind.
muhazz
User
Beiträge: 37
Registriert: Donnerstag 1. April 2010, 11:58

BlackJack hat geschrieben: Du kannst Dir mit `decimal`-Zahlen ja eine eigene `Complex`-Klasse basteln wenn Du möchtest.
Das klingt sehr gut.
Aber ich habe leider keine Ahnung, wie man so etwas umsetzt. Ich werde mich erkundigen und etwas experimentieren - um einige Tipps wäre ich dennoch sehr dankbar.
BlackJack hat geschrieben: Das ist kein ganz triviales Thema.
Das habe ich befürchtet :roll:
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

muhazz hat geschrieben:Hmm, mit decimal hatte ich grad ein wenig rumgespielt. Aber auch mit cmath sehe ich noch keine Möglichkeit, eine komplexe Zahl als Decimal zu benutzen. Geht auch nicht, oder?
Aufgrund der Art und Weise wie complex implementiert wurde ist das leider nicht möglich. Das verhindert auch, dass man das Problem einfach durch ableiten einer Unterklasse lösen kann. Du müsstest das leider komplett neu schreiben. Inklusive der ganzen Funktionen aus cmath.

Du könntest allerdings das Glück haben, dass diese Arbeit schon für dich erledigt wurde vom pypy-Projekt(pypy.org), allerdings befürchte ich, dass deren Implementierung nicht so ganz schön ist. -- edit: Nein kannst du vergessen.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

@muhazz: Vielleicht hilft es auch einfach ein anderen Algorithmus zu verwenden, der nicht so einen großen Fehler macht.
muhazz
User
Beiträge: 37
Registriert: Donnerstag 1. April 2010, 11:58

So, ich habe in meinem Algorithmus nun statt complex-Datenobjekten jeweils zwei decimal-Datenobjekte (jeweils einen für Real- und den Imaginärteil einer komplexen Zahl) benutzt und den Algorithmus auch entsprechend angepasst.

Das funktioniert zwar, bringt aber keine wahrnehmbare Verbesserung und die Rechenzeit verlängert sich erheblich - also kann ich mir das Umschreiben von irgendwelchen Klassen usw. auch sparen.

Vielleicht habe ich aber auch etwas falsch gemacht...das muss ich mir nochmal durch den Kopf gehen lassen.
Das ursprüngliche Problem besteht aber immernoch: Die Iteration verläuft zu ungenau.

Zumindest glaube ich das. Vielleicht liege ich da schon falsch und die Probleme kommen garnicht von einer zu ungenauen Berechnung der Iteration.

Vielleicht gehe ich nochmal etwas konkreter auf das Problem in diesem Thread ein:
http://www.python-forum.de/topic-22476.html

Vielleicht aber auch nicht. Mal schauen, was mein Kopfweh heute noch so macht...
muhazz
User
Beiträge: 37
Registriert: Donnerstag 1. April 2010, 11:58

Wer sich für meine eigentlichen Problemstellung interessiert, hier gehts weiter:
http://www.python-forum.de/post-166404.html#166404
Antworten