J'ai découvert l' //
opérateur en Python qui, dans Python 3, effectue une division avec le sol.
Y a-t-il un opérateur qui divise avec ceil? (Je connais l' /
opérateur qui en Python 3 effectue la division en virgule flottante.)
python
python-3.x
Cradam
la source
la source
Réponses:
Il n'y a pas d'opérateur qui divise avec ceil. Vous devez
import math
et utilisermath.ceil
la source
Vous pouvez simplement faire la division du sol à l'envers:
Cela fonctionne parce que l'opérateur de division de Python effectue la division par étage (contrairement à C, où la division entière tronque la partie fractionnaire).
Cela fonctionne également avec les grands entiers de Python, car il n'y a pas de conversion en virgule flottante (avec perte).
Voici une démonstration:
la source
int
contrairement à Python (enfin, pas de valeurs significatives; sur Python 64 bits, vous êtes limité aux30 * (2**63 - 1)
nombres de bits), et même la conversion temporaire enfloat
peut perdre des informations. Comparezmath.ceil((1 << 128) / 10)
avec-(-(1 << 128) // 10)
.Vous pouvez le faire
(x + (d-1)) // d
lors de la divisionx
pard
, c'est-à-dire(x + 4) // 5
.la source
math.ceil()
.sys.float_info.max
- dessus , et qu'il ne nécessite pas d'importation.Solution 1: convertir le sol en plafond avec négation
Réminiscence de l' astuce de lévitation de Penn & Teller , cela "bouleverse le monde (avec négation), utilise la division du sol simple (où le plafond et le sol ont été échangés), puis retourne le monde à droite (avec négation à nouveau) "
Solution 2: laissez divmod () faire le travail
La fonction divmod () donne
(a // b, a % b)
des nombres entiers (cela peut être moins fiable avec des flottants en raison d'une erreur d'arrondi). Le pas avecbool(r)
ajoute un au quotient chaque fois qu'il y a un reste non nul.Solution 3: Ajustez le numérateur avant la division
Traduisez le numérateur vers le haut pour que la division de plancher s'arrondisse au plafond prévu. Notez que cela ne fonctionne que pour les entiers.
Solution 4: Convertissez en flottants pour utiliser math.ceil ()
Le code math.ceil () est facile à comprendre, mais il se convertit des ints en floats et inversement. Ce n'est pas très rapide et cela peut avoir des problèmes d'arrondi. De plus, il s'appuie sur la sémantique Python 3 où "true division" produit un float et où la fonction ceil () renvoie un entier.
la source
-(-a // b)
o_O-(a // -b)
c'est plus rapide que-(-a // b)
, du moins lors du chronométrage des exemples de jouets avecpython -m timeit ...
Vous pouvez toujours le faire en ligne aussi
En python3, c'est juste un ordre de grandeur plus rapide que de forcer la division float et d'appeler ceil (), à condition que vous vous souciez de la vitesse. Ce que vous ne devriez pas, à moins que vous n'ayez prouvé par l'utilisation que vous en avez besoin.
la source
number=100000000
). Par appel unique, la différence est assez insignifiante.foo = -8
etbar = -4
, par exemple, la réponse doit être 2, pas 3, tout comme-8 // -4
. La division de plancher de Python est définie comme "celle de la division mathématique avec la fonction 'plancher' appliquée au résultat" et la division de plafond est la même chose mais avecceil()
au lieu defloor()
.Notez que math.ceil est limité à 53 bits de précision. Si vous travaillez avec de grands entiers, vous risquez de ne pas obtenir de résultats exacts.
La bibliothèque gmpy2 fournit un
c_div
fonction qui utilise l'arrondi au plafond.Avis de non-responsabilité: je maintiens gmpy2.
la source
python2 -c 'from math import ceil;assert ceil(11520000000000000102.9)==11520000000000000000'
(ainsi que le remplacementpython3
) LES DEUX sontTrue
Solution simple: a // b + 1
la source