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 :wink:

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.

Code: Alles auswählen

>>> float(2)
2.0
So weit so gut ;) Alles scheint gut zu sein :D

Code: Alles auswählen

>>> float(2.1)
2.1000000000000001
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 :D

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 :wink:)

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]
:lol:

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>