supérieur - Pourquoi les opérations math.ceil()et math.floor()de Python retournent-elles des flottants au lieu d'entiers?




javascript arrondi (8)

Parce que la bibliothèque mathématique de python est un wrapper mince autour de la bibliothèque mathématique C qui retourne des floats.

Quelqu'un peut-il expliquer cela (directement à partir des docs - emphase mien):

math.ceil (x) Retourne le plafond de x comme un float , la plus petite valeur entière supérieure ou égale à x.

math.floor (x) Retourne le plancher de x comme un flottant , la plus grande valeur entière inférieure ou égale à x.

Pourquoi .ceil et .floor retourneraient-ils des flottants alors qu'ils sont supposés calculer des entiers?

MODIFIER:

Eh bien, j'ai eu de très bons arguments pour expliquer pourquoi ils devraient renvoyer des flottants, et je @jcollado à @jcollado , quand @jcollado fait remarquer qu'ils retournent en fait des ints en Python 3 ...


La plage des nombres à virgule flottante dépasse généralement la plage des nombres entiers. En renvoyant une valeur à virgule flottante, les fonctions peuvent renvoyer une valeur sensible pour les valeurs d'entrée situées en dehors de la plage représentable d'entiers.

Considérons: Si floor() floor(1.0e30) un entier, que devrait retourner floor(1.0e30) ?

Maintenant, alors que les entiers de Python sont maintenant arbitrairement précis, ce n'était pas toujours le cas. Les fonctions de bibliothèque standard sont des wrappers minces autour des fonctions de bibliothèque C équivalentes.


Parce que la plage pour les flottants est supérieure à celle des entiers - retourner un nombre entier pourrait déborder


Peut-être parce que d'autres langues le font aussi, donc c'est un comportement généralement accepté. (Pour de bonnes raisons, comme indiqué dans les autres réponses)



La source de votre confusion est évidente dans votre commentaire:

Le but des opérations plafond / sol est de convertir les flotteurs en entiers!

Le point des opérations au plafond et au sol consiste à arrondir les données à virgule flottante aux valeurs intégrales . Ne pas faire une conversion de type. Les utilisateurs qui doivent 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 un arrondi à une valeur intégrale de façon triviale si tout ce dont vous disposiez était une opération ceil ou float qui renvoyait un entier. Vous devez d'abord vérifier que l'entrée est dans la plage des entiers représentables, puis appeler la fonction; vous auriez besoin de 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 voulez vous conformer à IEEE 754 .


C'est une question très intéressante! Comme un float nécessite quelques bits pour stocker l'exposant (= bits_for_exponent ), tout nombre à virgule flottante supérieur à 2**(float_size - bits_for_exponent) sera toujours une valeur intégrale! À l'autre extrême, un flottant avec un exposant négatif donnera un de 1 , 0 ou -1 . Ceci rend la discussion de la plage entière par rapport à la plage flottante sans intérêt car ces fonctions renverront simplement le nombre d'origine chaque fois que le nombre est en dehors de la plage du type entier. Les fonctions python sont des wrappers de la fonction C et donc c'est vraiment une insuffisance des fonctions C où elles auraient dû renvoyer un entier et forcé le programmeur à faire la vérification range / NaN / Inf avant d'appeler ceil / floor.

Ainsi, la réponse logique est la seule fois où ces fonctions sont utiles, elles retourneraient une valeur dans une fourchette entière et donc le fait qu'elles retournent un flotteur est une erreur et vous êtes très intelligent pour réaliser ceci!


Si vous ne souhaitez pas créer de nouvelle base de données ou si votre base de données contient plus de colonnes que celles que vous souhaitez diviser, vous pouvez:

df["flips"], df["row_name"] = zip(*df["row"].str.split().tolist())
del df["row"]  




python math