Seite 1 von 1

Divisionsverhalten

Verfasst: Donnerstag 23. Juni 2005, 16:47
von 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.

Verfasst: Freitag 24. Juni 2005, 09:25
von N317V
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.

Verfasst: Freitag 24. Juni 2005, 11:45
von mawe
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

Verfasst: Freitag 24. Juni 2005, 13:53
von N317V
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 ;-)

Verfasst: Freitag 24. Juni 2005, 13:54
von mawe
Mit welchen Sprachen hast Du's denn probiert?

Verfasst: Freitag 24. Juni 2005, 16:06
von 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.

Verfasst: Freitag 24. Juni 2005, 16:30
von Leonidas
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.

Verfasst: Samstag 25. Juni 2005, 12:40
von N317V
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.

Verfasst: Samstag 25. Juni 2005, 12:48
von jens
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?

Verfasst: Samstag 25. Juni 2005, 13:02
von Leonidas
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.

Verfasst: Sonntag 26. Juni 2005, 10:19
von jens
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?

Verfasst: Sonntag 26. Juni 2005, 10:47
von Leonidas
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.

Verfasst: Montag 27. Juni 2005, 08:09
von Olliminatore
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?

Verfasst: Montag 27. Juni 2005, 08:16
von jens

Code: Alles auswählen

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

Verfasst: Montag 27. Juni 2005, 08:23
von rayo
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

Verfasst: Montag 27. Juni 2005, 08:34
von Olliminatore
@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. :)