Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Usage de ~ qui, ce me semble, veut dire not.

18 réponses
Avatar
Dominique
Bonjour,

Python 3.8.5.

Je comprends mal le comportement de ~ (le tilde) :

soit a,b=5,7

a>b False normal

a>~b True, résultat attendu

b<a False, normal, mais

b<~a False aussi, et lÍ , je ne comprends pas. Voyez-vous pourquoi j'ai
ce résultat inattendu ? Je suppose que, Í  la question « b pas inférieur
Í  a », je devrais obtenir True...

En vous souhaitant un beau dimanche,

--
Dominique
Courriel : dominique point sextant ate orange en France
Esto quod es

8 réponses

1 2
Avatar
Olivier Miakinen
Le 11/04/2021 15:42, Alain Ketterlin a écrit :
Ton explication est correcte : en Python tous les entiers sont signés,
et tous les décalages "Í  droite" s'effectuent avec "extension de signe"
(le bit le plus Í  droite est répliqué). Dans -1 tous les bits sont Í  1,
et donc le restent lors du décalage.

C'est assez classique pour Í  peu près tous les langages dans lesquels les
entiers signés sont représentés en « complément Í  2 » et en taille fixe.
Mais je vois dans la suite de ta réponse que dans Python les entiers ne
sont pas contraints Í  une taille fixe.
(Juste un truc, pour être sÍ»r : le "bit de signe" est une expression
correcte -- le bit de poids fort, le plus Í  gauche, est effectivement 1
pour les entiers négatifs -- mais il vaut mieux éviter les confusions
avec la représentation "signed-magnitude", celle qui a deux
représentations de zéro.)

Oui, en effet. Cette repérsentation étant par exemple IEEE 754. Est-ce
que les réels en Python sont représentés en IEEE 754 ?
Et non, il n'y a pas d'entiers non signés en Python, ce qui n'a pas
vraiment de conséquence pratique, puisque tous les entiers sont de
précision arbitraire.

Ah oui, en effet :
2**1000



10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376
2.**1000



1.0715086071862673e+301
2.**10000



Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: (34, 'Numerical result out of range')
[...]
Rien de tout cela en Python : tout est signé, le décalage est toujours
arithmétique, il n'y a pas d'overflow, division et modulo sont corrects,
etc. C'est reposant, tant qu'on ne s'occupe pas de performance ou
d'occupation mémoire.

Oui. J'avais un Í  priori négatif au sujet de Python avant de m'y mettre,
mais maintenant au contraire je suis ravi d'avoir franchi le pas, et
« reposant » est vraiment le qualificatif qui convient.
Merci de tes réponses.
--
Olivier Miakinen
Avatar
Olivier Miakinen
Le 11/04/2021 16:11, je répondais Í  Alain Ketterlin :
Rien de tout cela en Python : tout est signé, le décalage est toujours
arithmétique, il n'y a pas d'overflow, division et modulo sont corrects,
etc. C'est reposant, tant qu'on ne s'occupe pas de performance ou
d'occupation mémoire.

Oui. J'avais un Í  priori négatif au sujet de Python avant de m'y mettre,
mais maintenant au contraire je suis ravi d'avoir franchi le pas, et
« reposant » est vraiment le qualificatif qui convient.
Merci de tes réponses.

Et pardon pour avoir constamment répondu sur autre chose que l'opérateur
« ~ », malgré le titre du fil et tes efforts méritoires pour toujours y
revenir. ;-)
--
Olivier Miakinen
Avatar
Dominique
Le 11/04/2021 Í  14:03, Benoit Izac a écrit :
Moi je pense que «Â a >> 1 == ~(~a >> 1) » donc vu que «Â -1 == ~0 » et
que «Â 0 >> d » vaut toujours 0, «Â ~(~0 >> d) == -1 ».

LÍ , j'avoue avoir décroché depuis un petit moment :-)
Je pense que je vais, temporairement, oublier le tilde...
Merci Í  vous tous,
--
Dominique
Courriel : dominique point sextant ate orange en France
Esto quod es
Avatar
Dominique
Le 11/04/2021 Í  11:47, Benoit Izac a écrit :
Bonjour,
Le 11/04/2021 Í  10:57, Dominique a écrit dans le message
<s4udl2$191p$ :
Je comprends mal le comportement de ~ (le tilde) :
[ce me semble, veut dire not.]

Inexact :
<https://docs.python.org/3/reference/expressions.html#unary-arithmetic-and-bitwise-operations>
«Â not » c'est… «Â not ».

C'est effectivement tout ce que je comprends de ce qui précède. Not et
tilde n'ont pas la même signification.
Merci et bonne fin de weekend,
--
Dominique
Courriel : dominique point sextant ate orange en France
Esto quod es
Avatar
Olivier Miakinen
Le 11/04/2021 17:34, Dominique a écrit :
Moi je pense que «Â a >> 1 == ~(~a >> 1) » donc vu que «Â -1 == ~0 » et
que «Â 0 >> d » vaut toujours 0, «Â ~(~0 >> d) == -1 ».

LÍ , j'avoue avoir décroché depuis un petit moment :-)
Je pense que je vais, temporairement, oublier le tilde...

Juste pour essayer de te « raccrocher », un exemple en supposant des
entiers sur 16 bits.
Si a s'écrit en binaire :
0000000011000001
alors ~a s'écrira en binaire :
1111111100111110
Tous les 0 de l'écriture en binaire deviennent des 1, et tous les 1
deviennent des 0.
En Python, avec des entiers de taille illimitée, c'est la même chose
sauf que, conceptuellement, il y a une infinité de 0 ou de 1 Í  gauche :
...0000000011000001
et :
...1111111100111110
--
Olivier Miakinen
Avatar
Alain Ketterlin
Olivier Miakinen <om+ writes:
[...]
Oui, en effet. Cette repérsentation étant par exemple IEEE 754. Est-ce
que les réels en Python sont représentés en IEEE 754 ?

Oui et non. En théorie, la règle est :
"These represent machine-level double precision floating point numbers.
You are at the mercy of the underlying machine architecture (and C or
Java implementation) for the accepted range and handling of overflow."
(https://docs.python.org/3/reference/datamodel.html#the-standard-type-hierarchy)
Et dans la bibliothèque standard, il est dit que :
"Floating point numbers are usually implemented using double in C"
(https://docs.python.org/3/library/stdtypes.html#typesnumeric)
Donc, en pratique, oui c'est IEEE 754 (double précision). Idem pour les
nombres complexes.
-- Alain.
Avatar
Benoit Izac
Bonjour,
Le 11/04/2021 Í  15:42, Alain Ketterlin a écrit dans le message
 :
Les autres opérations apparentées sont & | ^ (autres opérations binaires
bit-Í -bit : "and" "or" "xor"), ainsi que << et >> (décalages). Exercice
pour le lecteur : pourquoi est-ce que "-1 >> d" vaut -1 quelle que soit
la valeur de d ?

Je suppose que le décalage Í  droite propage le bit de signe, afin que
"-6 >> 1" vaille 3 tout comme "6 >> 1" vaut 3. Mais existe-t-il un type
d'entier non signé ? Un truc qui ferait que "unsigned(-1)" vaudrait un
de moins qu'une grande puissance de 2 ?

Ton explication est correcte : en Python tous les entiers sont signés,
et tous les décalages "Í  droite" s'effectuent avec "extension de signe"
(le bit le plus Í  droite est répliqué). Dans -1 tous les bits sont Í  1,
et donc le restent lors du décalage.

Ce n'est pas plutÍ´t le bit le plus Í  gauche qui est répliqué ?
--
Benoit Izac
Avatar
Alain Ketterlin
Benoit Izac writes:
[...]
pourquoi est-ce que "-1 >> d" vaut -1 quelle que soit la valeur de
d ?

Je suppose que le décalage Í  droite propage le bit de signe, afin que
"-6 >> 1" vaille 3 tout comme "6 >> 1" vaut 3. Mais existe-t-il un type
d'entier non signé ? Un truc qui ferait que "unsigned(-1)" vaudrait un
de moins qu'une grande puissance de 2 ?

Ton explication est correcte : en Python tous les entiers sont signés,
et tous les décalages "Í  droite" s'effectuent avec "extension de signe"
(le bit le plus Í  droite est répliqué). Dans -1 tous les bits sont Í  1,
et donc le restent lors du décalage.

Ce n'est pas plutÍ´t le bit le plus Í  gauche qui est répliqué ?

Si si, bien sÍ»r, merci d'avoir corrigé.
-- Alain.
1 2