Kann jemand dies erklären (direkt aus den Dokumenten - Hervorhebung von mir):
math.ceil (x) Gibt die Obergrenze von x als Gleitkommawert zurück , den kleinsten ganzzahligen Wert größer oder gleich x.
math.floor (x) Gibt den Boden von x als Float zurück , den größten ganzzahligen Wert kleiner oder gleich x.
Warum sollte .ceil
und .floor
Rückkehr schwebt , wenn sie per Definition sollen berechnen ganzen Zahlen?
BEARBEITEN:
Nun hätte dies einige sehr gute Argumente, warum sie sollten Schwimmer zurückkehren, und ich war nur die Idee zu gewöhnen, wenn @jcollado darauf hingewiesen , dass sie in der Tat zu tun Rückkehr Ints in Python 3 ...
int(floor(n))
.Antworten:
Der Bereich der Gleitkommazahlen überschreitet normalerweise den Bereich der ganzen Zahlen. Durch die Rückgabe eines Gleitkommawertes können die Funktionen einen sinnvollen Wert für Eingabewerte zurückgeben, die außerhalb des darstellbaren Bereichs von Ganzzahlen liegen.
Bedenken Sie: Wenn
floor()
eine Ganzzahl zurückgegeben wird, was solltefloor(1.0e30)
zurückgegeben werden?Während Pythons ganze Zahlen jetzt willkürliche Genauigkeit haben, war dies nicht immer so. Die Standardbibliotheksfunktionen sind Thin Wrapper um die entsprechenden C-Bibliotheksfunktionen.
quelle
floor(float("inf"))
oderceil(float("nan"))
.Wie aus anderen Antworten hervorgeht, geben sie in Python Floats zurück, wahrscheinlich aus historischen Gründen, um Überlaufprobleme zu vermeiden. In Python 3 geben sie jedoch Ganzzahlen zurück.
Weitere Informationen finden Sie in PEP 3141 .
quelle
float("inf")
oder versuchenfloat("nan")
, erhalten Sie eineOverflowError
Ausnahme.numpy.floor
undceil
return (<class 'numpy.float64'>)float("inf")
erzeugt keine Ausnahme in Python 2.7 oder 3Die Quelle Ihrer Verwirrung ist in Ihrem Kommentar ersichtlich:
Der Punkt der Decken- und Bodenoperationen besteht darin, Gleitkommadaten auf ganzzahlige Werte zu runden . Keine Typkonvertierung durchführen. Benutzer, die ganzzahlige Werte abrufen müssen, können nach der Operation eine explizite Konvertierung durchführen.
Beachten Sie, dass es nicht möglich wäre, eine Rundung auf einen ganzzahligen Wert als trivial zu implementieren, wenn Sie nur eine Ceil- oder Float-Operation zur Verfügung hätten, die eine Ganzzahl zurückgibt. Sie müssen zuerst überprüfen, ob die Eingabe innerhalb des darstellbaren Ganzzahlbereichs liegt, und dann die Funktion aufrufen. Sie müssten NaN und Unendlichkeiten in einem separaten Codepfad behandeln.
Darüber hinaus benötigen Sie Versionen von Ceil und Floor, die Gleitkommazahlen zurückgeben, wenn Sie IEEE 754 entsprechen möchten .
quelle
Weil die Python-Mathematikbibliothek ein dünner Wrapper um die C-Mathematikbibliothek ist, der Floats zurückgibt.
quelle
Vor Python 2.4 konnte eine Ganzzahl nicht den gesamten Bereich abgeschnittener reeller Zahlen enthalten.
http://docs.python.org/whatsnew/2.4.html#pep-237-unifying-long-integers-and-integers
quelle
Da der Bereich für Floats größer ist als der für Ganzzahlen, kann die Rückgabe einer Ganzzahl überlaufen
quelle
Das ist eine sehr interessante Frage! Da ein
bits_for_exponent
Gleitkomma einige Bits benötigt, um den Exponenten (= ) zu speichern, ist jede Gleitkommazahl größer als2**(float_size - bits_for_exponent)
immer ein ganzzahliger Wert! Am anderen Ende der Skala ein Schwimmer mit einem negativen Exponenten wird eines geben1
,0
oder-1
. Dies macht die Diskussion des Integer-Bereichs gegenüber dem Float-Bereich umstritten, da diese Funktionen einfach die ursprüngliche Nummer zurückgeben, wenn die Nummer außerhalb des Bereichs des Integer-Typs liegt. Die Python-Funktionen sind Wrapper derC
Funktion, und dies ist wirklich ein Mangel derC
Funktionen, bei denen sie eine Ganzzahl hätten zurückgeben und den Programmierer zwingen sollen, den Bereich / auszuführen.NaN
/Inf
Check durchzuführen, bevor Ceil / Floor aufgerufen wird.Daher ist die logische Antwort das einzige Mal, wenn diese Funktionen nützlich sind, dass sie einen Wert innerhalb eines ganzzahligen Bereichs zurückgeben. Die Tatsache, dass sie einen Float zurückgeben, ist ein Fehler, und Sie sind sehr klug, dies zu realisieren!
quelle
Vielleicht, weil andere Sprachen dies auch tun, so dass es allgemein akzeptiertes Verhalten ist. (Aus guten Gründen, wie in den anderen Antworten gezeigt)
quelle