Seite 1 von 1
Probleme mit Division [Es geht nicht um Kommastellen]
Verfasst: Dienstag 17. Oktober 2006, 20:09
von Murumesch
Hallo alle Zusammen!
Also ich bin noch ganz neu hier... Mein Problem ist folgendes: Wenn ich im Python Shell das folgende eingebe:
165239359999790353 / 2 --> bekomme ich "richtig" 82619679999895176L
einfach ohne Kommastelle.
wenn ich nun aber das eingebe:
165239359999790353 / 2.0 -->bekomme ich das Ergebnis ' 82619679999895184, das ist aber um 7.5 zu gross!
Wie kann ich diese "Art" von Fehlern verhindern ?
Vielen Dank für eure Zeit!
mfg Murumesch
Verfasst: Dienstag 17. Oktober 2006, 20:19
von BlackJack
Keine Fliesskommazahlen verwenden.
Re: Probleme mit Division [Es geht nicht um Kommastellen
Verfasst: Dienstag 17. Oktober 2006, 20:23
von Leonidas
Murumesch hat geschrieben:Wie kann ich diese "Art" von Fehlern verhindern ?
In dem du nicht mit Floats rechnest. Wenn du mit Integer-Werten auskommst solltest du bei diesen beliben. Wenn es dir auf die Nachkomma-Stellen ankommt, dann kannst du den Datentyp Decimal verwenden:
Code: Alles auswählen
In [64]: from decimal import Decimal
In [65]: 165239359999790353 / Decimal("2.0")
Out[65]: Decimal("82619679999895176.5")
Verfasst: Dienstag 17. Oktober 2006, 20:23
von CM
Hoi,
versuche es mal mit dem decimal-Modul. Das hat zwar gewisse andere Nachteile, aber Dein spezifisches Problem - die Zahl größer als Dein größtmögliches float - solltest Du so umgehen können.
Gruß,
Christian
edit: zu langsam, so am Abend
Verfasst: Dienstag 17. Oktober 2006, 20:26
von HWK
Im Prinzip geht es doch wieder im Kommastellen. Fließkommazahlen sind halt nicht in beliebiger Genauigkeit darstellbar. Probier doch mal:
Code: Alles auswählen
>>> 165239359999790353.0
1.6523935999979037e+017
>>> 16523935999979035.0
16523935999979034.0
>>> 1652393599997903.0
1652393599997903.0
Wenn es wirklich genau sein soll, mußt Du das
decimal-Modul verwenden.
MfG
HWK
Verfasst: Dienstag 17. Oktober 2006, 20:26
von Leonidas
CM hat geschrieben:edit: zu langsam, so am Abend
Pssssst, das geht heute schon den ganzen Tag so, dass verschiedene Leute versuchen schneller als BlackJack zu posten
Edit: Hi Marumesch, willkommen im Forum
Verfasst: Dienstag 17. Oktober 2006, 20:27
von EnTeQuAk
Stimmt.
So weit ich das weiß gibt es bei Fließkommazahlen, die mit dem Typ '' float '', eine kleine Ungenauigkeit. Wie groß die ist kannst du gaaaanz einfach testen.
So weit so gut
Alles scheint gut zu sein
Und genau hier siehst du die Ungenauigkeit
Das ist bei kleinen sachen sehr gering. bei großen allerdings wirkt sich das auch dementsprechend aus.
MfG EnTeQuAk
EDIT:
verdammt... das ging schnell
eignentlich war ich zweiter
Verfasst: Dienstag 17. Oktober 2006, 20:31
von CM
@Leonidas: LOL, versuche ich zwar gar nicht, aber vielleicht sollte ich erst einmal eine Viertelstunde abwarten, wenn er online ist? (no offense BJ
)
wobei mir aber noch einfällt: Je nach Applikation, kann man mit einer Modifikation von numpy ebenfalls höhere Präzision erreichen. Allerdings werde ich das erst herauskramen, wenn hier jemand echten Bedarf anmeldet ...
Gruß,
Christian
edit: und um hier noch kleine Mißverständnisse auszuräumen:
http://docs.python.org/tut/node16.html
Verfasst: Dienstag 17. Oktober 2006, 20:36
von BlackJack
Mindestens gegen Rebecca habe ich heute aber schon mal verloren.
Verfasst: Dienstag 17. Oktober 2006, 22:21
von Murumesch
Wow! Vielen Dank für die vielen Antworten !!!
Ich werde gleich alles ausprobieren !
Vielen Dank!
Murumesch
Verfasst: Mittwoch 18. Oktober 2006, 10:21
von jens
[wiki]Tutorial/Zahlen[/wiki]
Verfasst: Mittwoch 18. Oktober 2006, 14:39
von BlackJack
In dem Artikel fehlt eindeutig eine Erwähnung von ``from __future__ import division`` und der Ganzzahldivision mit ``//``.
Verfasst: Mittwoch 18. Oktober 2006, 15:39
von jens
Ist nun auch im Wiki...
Brauch man es auch für Python 2.5 ? Wo steht was in der Doku dazu?
Verfasst: Mittwoch 18. Oktober 2006, 15:45
von Leonidas
jens hat geschrieben:Brauch man es auch für Python 2.5 ? Wo steht was in der Doku dazu?
Ja, braucht man, bis Python 3.0.0 alpha 0:
Code: Alles auswählen
In [1]: from __future__ import division
In [2]: ?division
Type: instance
Base Class: __future__._Feature
String Form: _Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)
Namespace: Interactive
Docstring:
<no docstring>