genaues rechnen, modul decimal?

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.
Serpens66
User
Beiträge: 259
Registriert: Montag 15. Dezember 2014, 00:31

Sirius3 hat geschrieben:@Serpens66: es kommt halt immer auf das Epsilon an, das Du für Dein Problem geeignet wählen mußt.
ich danke euch jedenfalls nochmal fuer diesen Hinweis. Denn auch wenn die API exakte Werte liefert, so verwende ich ja selbst nur Werte auf 2 nachkommastellen genau, sodass spätestens durch meine eigenen Rundungen Abweichungen auftreten, die man auf diese Weise berücksichtigen könnte.

Da mir das aber aktuell noch nicht ganz in den Kopf reingeht, inwiefern dies nun anders ist, als "stumpf" immer auf 2 nachkommatellen zu runden (was allerdings fuer noch mehr fehler sorgt und aktuell auch ein Problem in meinem Skript ist, dass ich inkonsequent runde), belasse ich die "Lösung" erstmal bei der Verwendung von Decimal() an den kritischen Stellen. Das ist fuers Erste die Beste und einfachste Lösung.
Wenn ich dann alle anderen Baustellen beseitigt habe, kann man zur Optimierung dann nochmal überlegen, wie man es z.b durch epsilon und Co verbessert.
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Du musst halt beachten, ob an die "kritischen Stellen" nicht schon ungenaue Zahlen vorliegen.

Ich habe vor einiger Zeit mal getestet wie groß der Geschwindigkeitsunterschied bei Rechenoperationen auf Decimal zu float ist, und ich bin mir ziemlich sicher, dass der riesig war. Grundrechenarten haben dann mal eben 20 Mal so lange gedauert, wie mit Floats rechnen. Es ist also nicht nur "ein bisschen langsamer".
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Serpens66 hat geschrieben:euch fehlen die genauen infos um was fuer mengen es geht und wie diese zustande kommen.
Genau das aber wäre wichtig, um Dein Problem vernünftig anzugehen. Wenn 'exakte' Werte von einer API als float geliefert werden, dann hat die API schon einen Designfehler. Auch dann, wenn die Zahl als String repräsentiert wird; irgendwie kommt die Zahl ja zustande. Was also sind Deine Mengen: Spannung in Volt, Fisch in Gramm oder Gummibären als Stück?
Wenn die 'exakte' Genauigkeit stets bei acht Nachkommastellen liegt, dann konvertierst Du den String eben in einen Integer, der keine Nachkommastellen mehr aufweist (aber nicht per Multiplikation, denn das wäre wieder eine fehlerbehaftete float-Operation). Anschließend rechnest Du dann mit Integern weiter.
Da das Endergebnis nur auf zwei Nachkommastellen genau sein soll, kannst Du die letzten fünf Stellen verwerfen und gemäß der Dritten runden. Und dann kannst Du auch überlegen, wie groß denn das Epsilon ist, das Sirius3 und Blackjack schon ansprachen. Und ob anhand dessen die bisherige Genauigkeit im Zahlenrechnen überhaupt erforderlich war (es gibt ein schönes Zitat von Gauß zu diesem Thema).
Antworten