185 votes

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

Quelqu'un peut-il expliquer cela (directement à partir de l docs - c'est moi qui souligne) :

math.ceil(x) Retourne le plafond de x comme un flotteur le plus petit entier valeur supérieure ou égale à x.

math.floor(x) Retourne le plancher de x comme un flotteur le plus grand entier valeur inférieure ou égale à x.

Pourquoi .ceil et .floor renvoient des flottants alors qu'ils sont par définition censés calculer des entiers ?


EDIT :

Eh bien, il y a de très bons arguments pour expliquer pourquoi ils devrait et je commençais à m'habituer à l'idée, quand @jcollado a souligné qu'en fait, ils faire retourner des ints en Python 3...

1 votes

Je pense que c'est parce que x est un flottant et non un entier, mais comme je ne connais pas ou n'utilise pas Python, je vais laisser quelqu'un d'autre répondre de façon plus définitive :).

7 votes

@Adam- mais le but des opérations plafond/plancher est d'arrondir les flottants aux entiers !

2 votes

Cela m'a également irrité la première fois que je l'ai rencontré, car cela semble tout simplement faux. Au moins, ce n'est pas trop difficile à utiliser. int(floor(n)) .

111voto

jcollado Points 18325

Comme indiqué par d'autres réponses, en python, ils renvoient des flottants, probablement pour des raisons historiques afin d'éviter les problèmes de débordement. Cependant, ils renvoient des entiers dans python 3.

>>> import math
>>> type(math.floor(3.1))
<class 'int'>
>>> type(math.ceil(3.1))
<class 'int'>

Vous pouvez trouver plus d'informations dans PEP 3141 .

0 votes

@jcollado- Où voyez-vous qu'ils retournent des entiers dans P3 ?

5 votes

@Yarin J'ai juste tapé les commandes ci-dessus. Aussi, si vous essayez avec float("inf") ou float("nan") vous obtiendrez un OverflowError exception.

0 votes

@jcollado- Wow intéressant- je commençais juste à m'habituer au concept de retour comme flotteur...

106voto

Greg Hewgill Points 356191

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

Réfléchissez : Si floor() a retourné un nombre entier, que devrait floor(1.0e30) retour ?

Si les entiers de Python ont désormais une précision arbitraire, il n'en a pas toujours été ainsi. Les fonctions de la bibliothèque standard sont de minces enveloppes autour des fonctions équivalentes de la bibliothèque C.

14 votes

Et même si les entiers de Python ont désormais une précision arbitraire, il existe encore des flottants dont le plancher et le plafond ne peuvent pas être représentés par des entiers. Essayez floor(float("inf")) ou ceil(float("nan")) .

4 votes

@Michael- Apparemment dans P3 vous obtiendrez maintenant des OverflowExceptions si vous essayez cela. Voir jcollado Réponse de la Commission

5 votes

Er, il devrait retourner un type 'long' (a.k.a. 'bigint'), n'est-ce pas ? La réponse me semble évidente, mais j'ai l'impression d'être un peu naïf.

20voto

Charles Points 653

Parce que la bibliothèque mathématique de Python est une enveloppe fine autour de la bibliothèque mathématique C qui renvoie des flottants.

0 votes

La bibliothèque mathématique C supporte les entiers de précision arbitraire ? Parce que c'est ce que les autres fonctions mathématiques de Python renvoient.

18voto

Stephen Canon Points 58003

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

L'objectif des opérations plafond/plancher est de convertir des flottants en entiers !

Le but des opérations plafond et plancher est d'arrondir les données à virgule flottante à valeurs intégrales . Pas pour faire une conversion de type. Les utilisateurs qui ont besoin d'obtenir entier les valeurs peuvent effectuer une conversion explicite à la suite de l'opération.

Notez qu'il ne serait pas possible d'implémenter un arrondi à une valeur entière de manière aussi triviale si tout ce dont vous disposiez était une opération ceil ou float qui renvoie un entier. Il faudrait d'abord vérifier que l'entrée se situe dans la plage des entiers représentables, puis appeler la fonction ; il faudrait gérer les NaN et les infinis dans un chemin de code distinct.

De plus, vous devez disposer de versions de ceil et de floor qui renvoient des nombres à virgule flottante si vous souhaitez vous conformer à la norme IEEE 754 .

0 votes

Stephen J'ai réécrit mon commentaire Je voulais dire rond, pas converti. Mais ce n'était pas la source de ma confusion - c'est plutôt que je ne reconnaissais pas la disparité des gammes.

1 votes

Malheureusement, je n'ai pas de voix aujourd'hui. C'est la bonne réponse, bien plus que toute limitation de la représentation.

15 votes

Au cours de mes années de programmation, je ne me souviens pas avoir rencontré une situation où je recherché le résultat de floor/ceil pour être un flottant au lieu d'un entier. Le fait que python3 fait return integers montre que c'est en fait la chose la plus utile à faire. Je n'adhère pas à l'affirmation "le point de..." ; il semble que vous définissiez le point en fonction de ce qu'il fait, plutôt que de ce qu'un programmeur pourrait vouloir.

5voto

Mark Ransom Points 132545

Avant Python 2.4, un nombre entier ne pouvait pas contenir toute la gamme des nombres réels tronqués.

http://docs.python.org/whatsnew/2.4.html#pep-237-unifying-long-integers-and-integers

2 votes

Il ne peut pas non plus contenir la "gamme complète des nombres réels tronqués" maintenant, car il s'agit évidemment d'un ensemble infini qui nécessiterait donc une quantité infinie de mémoire. Il peut contenir la gamme des nombres réels tronqués. flotteurs qui n'est qu'un petit sous-ensemble de .

6 votes

@leftaroundabout - picky picky ! Tu savais ce que je voulais dire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X