Divisionsverhalten

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
BlackJack

Dieser Thread wurde aus dem Thread Einfaches Python Problem rausgeteilt, weil wir uns vom gelösten Problem etwas webgbewegt haben. So können hoffentlich mehr Leute von der Diskussion profitieren.

Du kannst am Anfang des Skriptes auch folgendes schreiben:

Code: Alles auswählen

from __future__ import division
Dann ist das Ergebnis von jeder Division mit / eine Fliesskommazahl. Ganzzahlige Division wird dann mit // gemacht.

Wie der Modulname `__future__` vielleicht schon vermuten lässt, soll das in folgenden Python-Versionen zum normalen Verhalten werden.

Edit (Leonidas): Teilung des Threads.
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

BlackJack hat geschrieben:Dann ist das Ergebnis von jeder Division mit / eine Fliesskommazahl.
Tatsächlich aus jeder? Auch Sachen wie 6/2 ? Das fänd ich aber doof. Tatsächlich ist dieses seltsame Divisionsverhalten von Python schon immer das was mich am meisten daran stört. Welchen Sinn macht das denn eigentlich?

Sorry, wenn das jetzt etwas OT ist.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!
N317V hat geschrieben: Auch Sachen wie 6/2 ? Das fänd ich aber doof.
Was ist daran so schlimm?
N317V hat geschrieben: Tatsächlich ist dieses seltsame Divisionsverhalten von Python schon immer das was mich am meisten daran stört.
Das ist nicht auf Python beschränkt. Eigentlich macht das fast jede Programmiersprache so. Bei denen mit static typing bekommst dann halt eine Fehlermeldung ;)

Gruß, mawe
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

mawe hat geschrieben:
N317V hat geschrieben: Auch Sachen wie 6/2 ? Das fänd ich aber doof.
Was ist daran so schlimm?
Nicht wirklich schlimm aber IMHO unnötig kompliziert. Vielleicht bin ich da ein bisschen blauäugig, aber für mich gilt: 6 durch 2 ist einfach nur 3.
mawe hat geschrieben:
N317V hat geschrieben: Tatsächlich ist dieses seltsame Divisionsverhalten von Python schon immer das was mich am meisten daran stört.
Das ist nicht auf Python beschränkt. Eigentlich macht das fast jede Programmiersprache so. Bei denen mit static typing bekommst dann halt eine Fehlermeldung ;)
Sorry, aber dass 9 durch 2 4 ergibt ist mir noch nirgends untergekommen. Vielleicht hatte ich aber auch nur Glück ;-)
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Mit welchen Sprachen hast Du's denn probiert?
BlackJack

N317V hat geschrieben:
mawe hat geschrieben:
N317V hat geschrieben: Auch Sachen wie 6/2 ? Das fänd ich aber doof.
Was ist daran so schlimm?
Nicht wirklich schlimm aber IMHO unnötig kompliziert. Vielleicht bin ich da ein bisschen blauäugig, aber für mich gilt: 6 durch 2 ist einfach nur 3.
Ja und? Wo liegt das Problem? Solange gilt ``3.0 == 3`` sollte das keinen Unterschied machen. Ich finde das alte Vehalten eher ungünstig weil für mich 5 durch 2 intuitiv 2.5 ist und nicht 2. Das finden sicher mehr Leute, die denken sie können Mathe, recht eigenartig.
mawe hat geschrieben:
N317V hat geschrieben: Tatsächlich ist dieses seltsame Divisionsverhalten von Python schon immer das was mich am meisten daran stört.
Das wird doch aber durch das "neue" Verhalten weniger seltsam. Der Unterschied zwischen ganzer Zahl und Fliesskommazahl mit ausschliesslich 0en hinter dem Komma ist mathematisch gesehen nicht da. Und trotzdem wird er von vielen Programmiersprachen künstlich hergestellt. An der Stelle scheint dann "Hardware" durch, die man in High-Level Programmiersprachen eigentlich nicht haben möchte. Darum wurde ja netterweise auch `int` und `long` vereinheitlicht, d.h. die Grenze zwischen beiden so fliessend wie möglich gemacht.
Das ist nicht auf Python beschränkt. Eigentlich macht das fast jede Programmiersprache so. Bei denen mit static typing bekommst dann halt eine Fehlermeldung ;)
Nicht in jedem Fall. In vielen Programmiersprachen wird automatisch zwischen den Zahlentypen gewandelt solange kein Genauigkeitsverlust auftreten kann. Und ganze Zahlen in Fliesskommazahlen umwandeln geht verlustfrei.

Code: Alles auswählen

float x = 9 / 2;
Das lässt sich in C, Java, C# ohne Fehler kompilieren und ergibt ``x == 4``. Vielleicht nicht das womit man gerechnet hat.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

9 / 2 gibt übrigens in Ruby auch 4, erst mit einem float-Wert gibt es 4.5, also genauso wie es in Python seit jeher war.

Mir persönlich ist es recht egal, jedes der bieden Verhalten hat Vor- und Nachteile.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Ich glaube es lohnt sich nicht weiter darüber zu diskutieren. Dass es bei anderen Sprachen auch so ist ändert auch nichts an der Tatsache, dass ich es irgendwie madig (lies: nicht intuitiv) finde. Ich hab mich ja auch immer mehr mir Mustererkennung und Stringmanipulation beschäftigt als mit reinen Rechenoperationen und wenn es nach mir geht bleibt das auch so. Python ist trotzdem die geilste Sprache, die ich kenne, weil (fast) immer hübsch unkompliziert und trotzdem mächtig.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Leonidas hat geschrieben:9 / 2 gibt übrigens in Ruby auch 4, erst mit einem float-Wert gibt es 4.5, also genauso wie es in Python seit jeher war.

Mir persönlich ist es recht egal, jedes der bieden Verhalten hat Vor- und Nachteile.
Ich bin auch mal drauf reingefallen... Man erwartet einfach von 9/2 keine 4 als Ergebniss... Aber wenn man es weiß, ist es halb so wild...
Wie ist es eigentlich in PHP? Weiß das einer?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich habe mal den Thread mal gesplittet, also Beschwerden bitte an mich 8)
N317V hat geschrieben:Dass es bei anderen Sprachen auch so ist ändert auch nichts an der Tatsache, dass ich es irgendwie madig (lies: nicht intuitiv) finde.
Naja, es ist unintuitiv das aus einer Operation mit zwei Ints auf einmal ein Float wird, aber auch unintuitiv das aus 9/2 4 wird. Hängt jetzt einfach ab, was man besser findet.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Leonidas hat geschrieben:Naja, es ist unintuitiv das aus einer Operation mit zwei Ints auf einmal ein Float wird, aber auch unintuitiv das aus 9/2 4 wird. Hängt jetzt einfach ab, was man besser findet.
Da hast du sicherlich schon recht... Nur man definiert in Python ja nicht explizit das 9 und 2 int-Zahlen sind ;)

Naja, aber wie __future__ angibt, wird sich das eh bald, IHMO zum besseren, ändern, was?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

jens hat geschrieben:Da hast du sicherlich schon recht... Nur man definiert in Python ja nicht explizit das 9 und 2 int-Zahlen sind ;)
Naja, explizit vielleicht nicht, jedoch weiß man ja, wenn man 2 und 9 hat, dass das Ints sind, genauso wie dass 2.0 und 9.0 Floats sind und 2L und 9L Longs sind (auch wenn es longs bald nicht mehr geben wird, was ich ganz gut finde).

Ich weiß allerdings nicht, wann das __future__ Verhalten zum Standard wird.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Olliminatore
User
Beiträge: 55
Registriert: Montag 30. Mai 2005, 16:03
Wohnort: schönsten Stadt Deutschlands
Kontaktdaten:

BlackJack hat geschrieben:3.0 == 3
Oh* das hatte ich noch gar nicht probiert. :oops: Ich hatte sonst immer mit Teilbarkeit geprüft.
Welche Methoden gibt es noch um zu prüfen ob eine float Zahl eine ganze Zahl ist?
Zuletzt geändert von Olliminatore am Montag 27. Juni 2005, 08:17, insgesamt 1-mal geändert.
[size=84][url=http://de.wikipedia.org/wiki/Jamba]Love Jamba[/url] <!--Olliminatore-->input<?/> [url=http://www.spreeblick.com/blog/index.php?p=324]Boycott Jamba[/url][code]def olliminiert(optimiert, eliminiert, terminiert):[/code][/size]
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Code: Alles auswählen

zahl = 3.0
print type(zahl)
zahl = 3
print type(zahl)
:wink:

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Ne er meint wie kann man Prüfen ob die Zahl genau xyz.0 ist.

Code: Alles auswählen

a = 3.0
print a == int(a)

Oder hab ich was falsch verstanden :D

Gruss
Olliminatore
User
Beiträge: 55
Registriert: Montag 30. Mai 2005, 16:03
Wohnort: schönsten Stadt Deutschlands
Kontaktdaten:

@jens
Ähm* Das will ich mal so stehen lassen.
Mein Ausdruck lässt wohl (Heute) wieder mal zu wünschen übrig. Ich meinte; Wie kann man noch prüfen ob eine Zahl vom Type float "eigendlich" den Wert einer Zahl vom Type integer hat (und diese dann in integer umwandeln).

@rayo
Ja, genau.
Ist diese die Beste?

Ok danke , sieht so aus als wenn ja. :)
[size=84][url=http://de.wikipedia.org/wiki/Jamba]Love Jamba[/url] <!--Olliminatore-->input<?/> [url=http://www.spreeblick.com/blog/index.php?p=324]Boycott Jamba[/url][code]def olliminiert(optimiert, eliminiert, terminiert):[/code][/size]
Antworten