Probleme mit Division [Es geht nicht um Kommastellen]

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
Murumesch
User
Beiträge: 2
Registriert: Dienstag 17. Oktober 2006, 19:57

Dienstag 17. Oktober 2006, 20:09

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
BlackJack

Dienstag 17. Oktober 2006, 20:19

Keine Fliesskommazahlen verwenden.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 17. Oktober 2006, 20:23

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")
My god, it's full of CARs! | Leonidasvoice vs Modvoice
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Dienstag 17. Oktober 2006, 20:23

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
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Dienstag 17. Oktober 2006, 20:26

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
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 17. Oktober 2006, 20:26

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 :)
Zuletzt geändert von Leonidas am Dienstag 17. Oktober 2006, 20:27, insgesamt 1-mal geändert.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Dienstag 17. Oktober 2006, 20:27

;) 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
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Dienstag 17. Oktober 2006, 20:31

@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
BlackJack

Dienstag 17. Oktober 2006, 20:36

Mindestens gegen Rebecca habe ich heute aber schon mal verloren. ;-)
Murumesch
User
Beiträge: 2
Registriert: Dienstag 17. Oktober 2006, 19:57

Dienstag 17. Oktober 2006, 22:21

Wow! Vielen Dank für die vielen Antworten !!!

Ich werde gleich alles ausprobieren !

Vielen Dank!
Murumesch
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 18. Oktober 2006, 10:21

[wiki]Tutorial/Zahlen[/wiki]
:lol:

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Mittwoch 18. Oktober 2006, 14:39

In dem Artikel fehlt eindeutig eine Erwähnung von ``from __future__ import division`` und der Ganzzahldivision mit ``//``.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 18. Oktober 2006, 15:39

Ist nun auch im Wiki...

Brauch man es auch für Python 2.5 ? Wo steht was in der Doku dazu?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 18. Oktober 2006, 15:45

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>
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten