|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | |||||
|
Membre du Club
![]() Inscription : mai 2008 Messages : 235 ![]() |
Bonjour à tous,
je suis entrain de retaper une application Javascript en python, et je suis tombé sur un problème: à un moment dans le script, je tombe sur un ligne: alors, je farfouille un peu et je trouve ceci sur un autre site : Citation:
pour x = 1751007518 et n = 1 Code :
et c'est d'ailleur ce que python me reponds si je lui demande "1751007518<<1" Alors.... pourquoi en javascript "alert(1751007518<<1)" me renvoie -792952260 ???? oO en regardant d'un peu plus pres, Si on compare un peu les deux valeur binaire: Code :
Ou peut être un problème avec le bit du signe ? Donc voila, si quelqu'un à une explication, voir un bout de code (python) qui me permetrai de faire quelque chose l'équivalent ça serrait super ^^ |
|||||
|
|
00
|
|
|
#2 | ||
|
Membre régulier
![]() Inscription : décembre 2007 Messages : 61 ![]() |
Parce qu'en javascript il n'y a pas de nombres entiers.
Tout les nombres sont des Doubles IEEE 754 de 32 bits. Donc quand tu fais un shift sur un grand nombre comme ça qui occupe déjà les 31 bits de ta mantisse et de ton exposant, tu débordes sur le 32ème bit qui sert au signe. Enfin bon en gros : faire des opérations binaires en JS c'est la merde et c'est imprévisible. http://fr.wikipedia.org/wiki/IEEE_75..._.2832_bits.29 Code :
|
||
|
|
00
|
|
|
#3 |
|
Membre régulier
![]() Inscription : décembre 2007 Messages : 61 ![]() |
PS : de toute évidence c'est un bug dans ton programme d'origine, ne cherche pas à le reproduire.
Ou alors c'est réellement volontaire, mais alors c'est vraiment un gros hack bien sale et tu devrais réécrire quelque chose de plus stable que ce bricolage. |
|
|
00
|
|
|
#4 | ||||
|
Membre Expert
![]() Boris Dessysans emploi Inscription : décembre 2010 Messages : 872 ![]() |
Citation:
Citation:
Je travaille actuellement sur un code, qui compactes des données de tailles connues dans des nombres binaires avant des les convertir dans une autre bases pour les envoyer sous forme d'une chaine compactée. Code :
|
||||
|
|
00
|
|
|
#5 |
|
Membre régulier
![]() Inscription : décembre 2007 Messages : 61 ![]() |
Oui tu as raison.
Ça ne sert à rien de se dire c'est de la merde sans essayer de comprendre. D'ailleurs je pense que je me suis un peu planté plus haut quand je dis "Donc quand tu fais un shift sur un grand nombre comme ça qui occupe déjà les 31 bits de ta mantisse et de ton exposant, tu débordes sur le 32ème bit qui sert au signe." Quand tu fais un shift, ton Double doit être convertit en int signé de 32 bits, et c'est dans cet int temporaire que tu déborde sur le 32ème bit de poids fort qui sert au signe. Car faire un shift sur la représentation binaire d'un flottant cela n'a pas trop de sens. Et cela explique aussi pourquoi une multiplication marche mais pas un shift : quand on multiplie, on ne convertit pas en int, et l'on reste dans dans une amplitude de valeurs exprimable avec un Double. PS : de plus un Double c'est 64 et non 32 bits.
|
|
|
00
|
|
|
#6 |
|
Membre du Club
![]() Inscription : mai 2008 Messages : 235 ![]() |
Merci pour ces explications, je pensais bien à quelque chose comme ça, sans véritablement savoir.
Mais alors, du coup, comment reproduire se "bug" dans un autre langage, car, effectivement, j'ai besoin de le reproduire, puisque les valeurs qui ont été calculées au préalable avec JS sont enregistrées, il faut donc que je puisse toujours faire la transition en python. Peux être mieux faut il que je pause la question dans la partie python ? encore merci |
|
|
00
|
|
|
#7 | |
|
Membre régulier
![]() Inscription : décembre 2007 Messages : 61 ![]() |
Citation:
Après la vrai question c'est de savoir si Python à ce type de donnée ou si tu dois faire appel à un package tiers qui l'implémenterais... pour ça effectivement, mieux vaut demander dans la section Python. |
|
|
|
00
|
|
|
#8 |
|
Membre du Club
![]() Inscription : mai 2008 Messages : 235 ![]() |
Et bien merci pour tout, je vais allé me renseigner de ce coté
|
|
|
00
|
|
|
#9 | ||
|
Membre Expert
![]() Boris Dessysans emploi Inscription : décembre 2010 Messages : 872 ![]() |
2 petites précisions en plus :
- es-tu certain que ton code atteint de valeurs extrêmes comme celle que tu as utilisais pour provoquer le bug ? parce que rotation binaire ou non, c'est étrange(inhabituel) d'utiliser d'aussi grandes valeurs. - en fait : Code :
(2^30 = plus grande puissance de 2 stockable sur 31 bits[0->30]... vu que le 32ème sert au signe) 1751007518 * 2 = 3502015036 2^30 = 1073741824 3502015036 mod 1073741824 = 280789564 280789564 - 1073741824 = -792952260 car si "101111010000110111110111000100" est bien la représentation binaire de 792952260 sa valeur négative n'est en réalité pas stockée sous cette forme en mémoire. comme tu peux le voir ici, la représentation négative d'un nombre en machine se fait en complément à deux : http://fr.wikipedia.org/wiki/Syst%C3..._n.C3.A9gatifs c'est pour cette raison que tu te retrouves avec tous les bits inversée (après troncage de ceux qui ont dépassé le 31 bit)
|
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com