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

Probleme mit Division [Es geht nicht um Kommastellen]

Beitragvon Murumesch » 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

Beitragvon BlackJack » Dienstag 17. Oktober 2006, 20:19

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

Re: Probleme mit Division [Es geht nicht um Kommastellen

Beitragvon Leonidas » 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:

Beitragvon CM » 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

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

Beitragvon Leonidas » 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:

Beitragvon EnTeQuAk » 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:

Beitragvon CM » 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

Beitragvon 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

Beitragvon Murumesch » 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: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » 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

Beitragvon 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: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

Beitragvon Leonidas » 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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder