Quelqu'un peut-il expliquer cela (directement à partir de la documentation - c'est moi qui souligne):
math.ceil (x) Renvoie le plafond de x sous forme de flottant , la plus petite valeur entière supérieure ou égale à x.
math.floor (x) Renvoie le plancher de x sous forme de flottant , la plus grande valeur entière inférieure ou égale à x.
Pourquoi renverrait .ceil
et .floor
renverrait des flottants alors qu'ils sont par définition censés calculer des entiers?
ÉDITER:
Eh bien cela a de très bons arguments pour expliquer pourquoi ils devraient retourner flotteurs, et je ne faisais que se habituer à l'idée, quand @jcollado a fait remarquer que , en fait , qu'ils font ints de retour en Python 3 ...
int(floor(n))
.Réponses:
La plage de nombres à virgule flottante dépasse généralement la plage d'entiers. En renvoyant une valeur à virgule flottante, les fonctions peuvent renvoyer une valeur sensible pour les valeurs d'entrée qui se trouvent en dehors de la plage représentable d'entiers.
Considérez: si
floor()
un entier est renvoyé, que doit-ilfloor(1.0e30)
renvoyer?Maintenant, alors que les entiers de Python sont désormais de précision arbitraire, ce n'était pas toujours le cas. Les fonctions de bibliothèque standard sont des enveloppes minces autour des fonctions de bibliothèque C équivalentes.
la source
floor(float("inf"))
ouceil(float("nan"))
.Comme indiqué par d'autres réponses, en python, ils renvoient des flottants probablement pour des raisons historiques pour éviter les problèmes de débordement. Cependant, ils renvoient des entiers en python 3.
Vous pouvez trouver plus d'informations dans la PEP 3141 .
la source
float("inf")
oufloat("nan")
, vous obtiendrez uneOverflowError
exception.numpy.floor
et deceil
retour (<class 'numpy.float64'>)float("inf")
ne produit pas d'exception en Python 2.7 ou 3La source de votre confusion est évidente dans votre commentaire:
Le but des opérations ceil et floor est d'arrondir les données à virgule flottante en valeurs intégrales . Ne pas faire de conversion de type. Les utilisateurs qui ont besoin d'obtenir des valeurs entières peuvent effectuer une conversion explicite après l'opération.
Notez qu'il ne serait pas possible d'implémenter une valeur arrondie à intégrale aussi trivialement si tout ce dont vous disposiez était une opération ceil ou float qui retournait un entier. Vous devez d'abord vérifier que l'entrée est dans la plage d'entiers représentables, puis appeler la fonction; vous devrez gérer NaN et les infinis dans un chemin de code séparé.
De plus, vous devez avoir des versions de ceil et floor qui renvoient des nombres à virgule flottante si vous souhaitez vous conformer à IEEE 754 .
la source
Parce que la bibliothèque mathématique de python est un wrapper fin autour de la bibliothèque mathématique C qui renvoie des flottants.
la source
Avant Python 2.4, un entier ne pouvait pas contenir la plage complète des nombres réels tronqués.
http://docs.python.org/whatsnew/2.4.html#pep-237-unifying-long-integers-and-integers
la source
Parce que la plage des flottants est supérieure à celle des entiers, le renvoi d'un entier peut déborder
la source
C'est une question très intéressante! Comme un flottant nécessite quelques bits pour stocker l'exposant (=
bits_for_exponent
), tout nombre à virgule flottante supérieur à ce2**(float_size - bits_for_exponent)
sera toujours une valeur intégrale! À l'autre extrême, un flottant avec un exposant négatif donnera l'un de1
,0
ou-1
. Cela rend la discussion de la plage entière par rapport à la plage flottante, car ces fonctions renverront simplement le numéro d'origine chaque fois que le nombre est en dehors de la plage du type entier. Les fonctions python sont des wrappers de laC
fonction et c'est donc vraiment une carence desC
fonctions où elles auraient dû retourner un entier et forcer le programmeur à faire le range /NaN
/Inf
check avant d'appeler ceil / floor.Ainsi, la réponse logique est la seule fois où ces fonctions sont utiles, elles renverraient une valeur dans une plage entière et donc le fait qu'elles renvoient un flottant est une erreur et vous êtes très intelligent pour le réaliser!
la source
Peut-être parce que d'autres langues le font également, c'est donc un comportement généralement accepté. (Pour de bonnes raisons, comme indiqué dans les autres réponses)
la source