Immer diese Fließkommazahlen, dauernd habe ich Probleme mit denen
Also hier ist mein Problem, ich hoffe jemand kann mir helfen:
Ich will, dass eine Zählervariable bei jedem Durchlauf um eine beliebige Zahl erhöht wird, die auch eine Fließkommazahl sein kann.
Nun haben Fließkommazahlen ja keine absolute genauigkeit. Bei einer einzelnen Zahl macht das zwar keinen großen Unterschied, aber wenn ich die Zählerschleife ein paar mal durchlaufen lasse, summiert sich dieser Fehler ja.
Hat jemand einen Vorschlag, wie ich diesen Effekt zumindest minimieren kann.
Ich habe mir selbst schon Gedanken gemacht. Mein Ansatz war, den Zähler nach jedem hochzählen auf so viele Stellen zu runden, wie die Variable hat, um die hochgezählt werden soll.
Dadurch währe immer nur ein Fehler vorhanden, da die anderen weggerundet würden. Kann das so funktionieren und wenn ja, wie finde ich heraus, wie viele Stellen eine Fließkommazahl hat?
Problem mit Fließkommazahlen in Zählern
-
- User
- Beiträge: 728
- Registriert: Sonntag 22. September 2002, 08:32
- Wohnort: Sauerland
- Kontaktdaten:
Hallo Kartoffel, was ist der Grund, daß du unbedingt Fließkommazahlen verwenden mußt?
Wenn du das Ergebnis bei jedem Durchlauf rundest, ist der Fehler nach 1000 Durchläufen nicht gerade klein. Ich würde dieses nicht so machen. Gib doch mal ein kurzes Beispiel.
Hans
Wenn du das Ergebnis bei jedem Durchlauf rundest, ist der Fehler nach 1000 Durchläufen nicht gerade klein. Ich würde dieses nicht so machen. Gib doch mal ein kurzes Beispiel.
Hans
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
Hi Kartoffel,
ich würd auch gerne wissen, warum Floats? Wenn Du z.B. mit Währungen rechnenn willst, nimm doch cent oder 1/10 cent und dividiere dann durch 100 bzw 1000 um den Eurobetrag zu bekommen. Oder bastel Dir Deine eigene Klasse.
Gruß
Dookie
ich würd auch gerne wissen, warum Floats? Wenn Du z.B. mit Währungen rechnenn willst, nimm doch cent oder 1/10 cent und dividiere dann durch 100 bzw 1000 um den Eurobetrag zu bekommen. Oder bastel Dir Deine eigene Klasse.
Gruß
Dookie
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
also wenn Du ein Intervall von 0-1 in 0.01er Schritten willst, nimm eben ein
Gruß
Dookie
Code: Alles auswählen
for i in range(101):
x = i/100.0
y = funktion(x)
plot(x,y)
Dookie
-
- User
- Beiträge: 728
- Registriert: Sonntag 22. September 2002, 08:32
- Wohnort: Sauerland
- Kontaktdaten:
so ganz komme ich nicht weiter. über welchen Wertebereich reden wird denn? 10E-3, 10E-6, ..... ist alles kleiner 1.
Sorry hab deine letzte Mail nicht richtig gelesen. Lass den Wert so stehen! Genauer gehts mit EDV nicht. Vielleicht wüde da ein 64 Bit System etwas weiterhelfen. Das Problem wird aber nie vollständig gelöst. Die Ausgabe solltest du allerdings auf x Nachkommastellen formatieren.
Hans
Sorry hab deine letzte Mail nicht richtig gelesen. Lass den Wert so stehen! Genauer gehts mit EDV nicht. Vielleicht wüde da ein 64 Bit System etwas weiterhelfen. Das Problem wird aber nie vollständig gelöst. Die Ausgabe solltest du allerdings auf x Nachkommastellen formatieren.
Hans
Also, der Wertebereich sieht folgendermaßen aus:
Der Benutzer gibt den Bereich des Koordinatensystems an, der gezeichnet werden soll. (zB von x=-5 bis x=10)
Dann werden in einem bestimmten Abstand (zB 0.01) Werte für die Funktion ausgerechnet.
Also in meinem Beispiel für -5; -4,99; ...;10
Mein Problem ist, dass die Fehler in der Genauigkeit bestimmter Fließkommazahlen dazu führen, dass zum Beispiel der letzte x-Wert nicht genau 10 ist
Der Benutzer gibt den Bereich des Koordinatensystems an, der gezeichnet werden soll. (zB von x=-5 bis x=10)
Dann werden in einem bestimmten Abstand (zB 0.01) Werte für die Funktion ausgerechnet.
Also in meinem Beispiel für -5; -4,99; ...;10
Mein Problem ist, dass die Fehler in der Genauigkeit bestimmter Fließkommazahlen dazu führen, dass zum Beispiel der letzte x-Wert nicht genau 10 ist
-
- User
- Beiträge: 728
- Registriert: Sonntag 22. September 2002, 08:32
- Wohnort: Sauerland
- Kontaktdaten:
Das Thema hatten wir schon einmal. Hier der Thread: http://python.sandtner.net/viewtopic.ph ... sc&start=0
also wieviele Nachkommastellen angezeigt werden ist glaube ich nicht so interessant zu wissen. Sorge bitte dafür, dass deine Zahlen mit hinreichender Gnauigkeit dargestellt werden. Ein Wert von 4,999 oder 5,001 ist meistens mit 5,00 hinreichend genau beschrieben. Kommt immer auf den Einzelfall an.
Wenn du immer diese Genauigkeit vorraussetzt, dann wirs du nie einen Autoatlas aufschlagen dürfen, weil dir alle Karten viel zu ungenau sind. Selbst mit Satellietenaufnahmen hast du auf Grund von Verzerrungen dein Genauigkeitsproblem. Dies mal nur so als Beispiel.
Hans
also wieviele Nachkommastellen angezeigt werden ist glaube ich nicht so interessant zu wissen. Sorge bitte dafür, dass deine Zahlen mit hinreichender Gnauigkeit dargestellt werden. Ein Wert von 4,999 oder 5,001 ist meistens mit 5,00 hinreichend genau beschrieben. Kommt immer auf den Einzelfall an.
Wenn du immer diese Genauigkeit vorraussetzt, dann wirs du nie einen Autoatlas aufschlagen dürfen, weil dir alle Karten viel zu ungenau sind. Selbst mit Satellietenaufnahmen hast du auf Grund von Verzerrungen dein Genauigkeitsproblem. Dies mal nur so als Beispiel.
Hans
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
Hi also
was willst Du mehr?
Gruß
Dookie
Code: Alles auswählen
>>> for i in range(50,101):
... print i/100.0
...
0.5
0.51
0.52
0.53
0.54
0.55
0.56
0.57
0.58
0.59
0.6
0.61
0.62
0.63
0.64
0.65
0.66
0.67
0.68
0.69
0.7
0.71
0.72
0.73
0.74
0.75
0.76
0.77
0.78
0.79
0.8
0.81
0.82
0.83
0.84
0.85
0.86
0.87
0.88
0.89
0.9
0.91
0.92
0.93
0.94
0.95
0.96
0.97
0.98
0.99
1.0
>>>
Gruß
Dookie
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
von -0.5 an gehts auch
Code: Alles auswählen
>>> for i in range(-50,101):
... print i/100.0,
...
-0.5 -0.49 -0.48 -0.47 -0.46 -0.45 -0.44 -0.43 -0.42 -0.41 -0.4 -0.39 -0.38 -0.37 -0.36 -0.35 -0.34 -0.33 -0.32 -0.31 -0.3 -0.29 -0.28 -0.27 -0.26 -0.25 -0.24 -0.23 -0.22 -0.21 -0.2 -0.19 -0.18 -0.17 -0.16 -0.15 -0.14 -0.13 -0.12 -0.11 -0.1 -0.09 -0.08 -0.07 -0.06 -0.05 -0.04 -0.03 -0.02 -0.01 0.0 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1 0.11 0.12 0.13 0.14 0.15 0.16 0.17 0.18 0.19 0.2 0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28 0.29 0.3 0.31 0.32 0.33 0.34 0.35 0.36 0.37 0.38 0.39 0.4 0.41 0.42 0.43 0.44 0.45 0.46 0.47 0.48 0.49 0.5 0.51 0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59 0.6 0.61 0.62 0.63 0.64 0.65 0.66 0.67 0.68 0.69 0.7 0.71 0.72 0.73 0.74 0.75 0.76 0.77 0.78 0.79 0.8 0.81 0.82 0.83 0.84 0.85 0.86 0.87 0.88 0.89 0.9 0.91 0.92 0.93 0.94 0.95 0.96 0.97 0.98 0.99 1.0
>>>
-
- User
- Beiträge: 728
- Registriert: Sonntag 22. September 2002, 08:32
- Wohnort: Sauerland
- Kontaktdaten:
Code: Alles auswählen
#!/usr/bin/python
i = -0.05
s = 0.01
while i < 0.050001:
print "%5.2f %.25f" % (i,i)
i = i + s
Code: Alles auswählen
[hans@rosi tmp]$ ./teste.py
-0.05 -0.0500000000000000027755576
-0.04 -0.0400000000000000008326673
-0.03 -0.0299999999999999988897770
-0.02 -0.0199999999999999969468867
-0.01 -0.0099999999999999967387199
0.00 0.0000000000000000034694470
0.01 0.0100000000000000036776138
0.02 0.0200000000000000038857806
0.03 0.0300000000000000058286709
0.04 0.0400000000000000077715612
0.05 0.0500000000000000097144515
[hans@rosi tmp]$
Glaub mir, in dem Fall lohnt es nicht. Dafür bekommste nicht einmal einen Löffel billige Marmelade, geschweige den ein Bier oder Getränk nach Wahl.
Ich habe noch gelernt mit Rechnschieber und fünf- und siebenstelliger Logaithmentafel umzugehen. Und da waren die Abweichungen wesentlich größer und trotzdem ist die Welt nicht an den zu großen Toleranzen zu Grunde gegangen.
Danke, Dookie. So was ähnliches hatte ich mir über Nacht auch schon überlegt.
Ansonsten glaub ich sogar, dass die Abweichung zu vernachlässigen ist, ich bin eben Perfektionist und will supergenaue Zahlen ohne langen Rattenschwanz von Nullen dran haben.
Ich würde sagen, ich erkläre mein Problem hiermit offiziell für erledigt. Vieleicht mach ichs so ähnlich wie der Vorschlag von Dookie, oder ich finde mich mit den "unschönen" Zahlen endgültig ab. Trotzem nochmal danke an alle!
Edit:
Hier ist meine Funktion:
Ansonsten glaub ich sogar, dass die Abweichung zu vernachlässigen ist, ich bin eben Perfektionist und will supergenaue Zahlen ohne langen Rattenschwanz von Nullen dran haben.
Ich würde sagen, ich erkläre mein Problem hiermit offiziell für erledigt. Vieleicht mach ichs so ähnlich wie der Vorschlag von Dookie, oder ich finde mich mit den "unschönen" Zahlen endgültig ab. Trotzem nochmal danke an alle!
Edit:
Hier ist meine Funktion:
Code: Alles auswählen
def floatrange (start, stop, step): return map(lambda x: x*step, range(start/step, stop/step+1))