recuperer le signe d'une variable

recuperer le signe d'une variable - C++ - Programmation

Marsh Posté le 16-09-2004 à 12:45:17    

Salut,
 
Est ce que quelqu'un sait s'il y a moyen de recuperer le signe d'une variable ?
Pour etre exact, j'aimerais comparer le signe de plusieurs variables, et je voudrais savoir s'il est possible de le faire sans passer par une expression booleenne avec tous les cas...
 
merci  :bounce:


---------------
EurOPiUM, leader de WormsHL
Reply

Marsh Posté le 16-09-2004 à 12:45:17   

Reply

Marsh Posté le 16-09-2004 à 13:09:03    

ok je ne sais pas si ya directement une fonction pour ca, en tout cas c'etait tout bete....
 

Code :
  1. signe(a)==a/abs(a)


 
..........


---------------
EurOPiUM, leader de WormsHL
Reply

Marsh Posté le 16-09-2004 à 13:13:25    

ben tu fais  
 
a - a  
 
si a est positif --> = 0
si a est négatif --> > 0

Reply

Marsh Posté le 16-09-2004 à 13:56:33    

hmmm,
 
essayons :)
 
a = 2
a - a = 0
cool :)
a = -2
a - a =
(-2) - (-2) =  
-2 + 2 =  
2 -2 = 0
hmmm :(  
 Je peut pas faire mieux pour t'aider JagStang....

Reply

Marsh Posté le 16-09-2004 à 14:00:00    

pardon. j'ai sorti ça de tête, sans trop chercher.  
 
la formule est plutôt
 
a - abs(a)
 
si a=3
3 - 3 = 0
 
a = -5
(-5) - abs(-5) = -5 -5 = -10
 
c'est pas tout à fait ce que j'avais dit. mais on arrive quand même à qqch...
 
sorry en tout cas

Reply

Marsh Posté le 16-09-2004 à 14:03:38    

Nan mais c'est pas un peu compliqué tout ça ??  
 

Code :
  1. bool bNegatif = a < 0;

Reply

Marsh Posté le 16-09-2004 à 14:05:03    

ça doit être la fatigue
 
[:neowen]

Reply

Marsh Posté le 16-09-2004 à 14:08:56    

[:rofl]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 16-09-2004 à 16:51:21    

cricri_ a écrit :

Nan mais c'est pas un peu compliqué tout ça ??  
 

Code :
  1. bool bNegatif = a < 0;




 
ouaip merci, justement c'est ce que je veux eviter ... j'ai enormement de variables a tester et... je suis feignant, jvoulais faire autrement!
me disais aussi qu'il y avait peut etre un hack du genre regarder la variable en binaire, et si son premier chiffre est '1' alors il est negatif !???? vrai ou pas ?


---------------
EurOPiUM, leader de WormsHL
Reply

Marsh Posté le 16-09-2004 à 16:53:11    

europium a écrit :

ouaip merci, justement c'est ce que je veux eviter ... j'ai enormement de variables a tester et... je suis feignant, jvoulais faire autrement!
me disais aussi qu'il y avait peut etre un hack du genre regarder la variable en binaire, et si son premier chiffre est '1' alors il est negatif !???? vrai ou pas ?


Tu veux éviter de tester si ta variable est inférieure à 0 ou non et tu parles de regarder sa valeur bit à bit? Et sinon, ça t'arrive d'être sobre? [:mlc]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 16-09-2004 à 16:53:11   

Reply

Marsh Posté le 16-09-2004 à 16:58:22    

Ca... consiste en quoi... tes tests?
exactement
 
non parce que  

Code :
  1. if(a < 0)


ca marche achtement bien pour savoir si une variable est négative :o


Message édité par masklinn le 16-09-2004 à 16:59:28

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 16-09-2004 à 17:01:12    

c'est quoi le problème avec le signe < ?
 
 
vu comment t'as l'air dégourdi, je doute que ce test minable soit le point chaud de ton application : mais si tu veux faire une merde non portable, bien illisible, stupide plutot de faire ce qu'un gamin de 3 ans fait intuitivement ...

Reply

Marsh Posté le 16-09-2004 à 17:05:42    

Taz a écrit :

c'est quoi le problème avec le signe < ?
 
 
vu comment t'as l'air dégourdi, je doute que ce test minable soit le point chaud de ton application : mais si tu veux faire une merde non portable, bien illisible, stupide plutot de faire ce qu'un gamin de 3 ans fait intuitivement ...


 :love:


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 16-09-2004 à 17:10:04    

seulement voilà, encore faudrait il avoir des petites de notion sur ce qu'est un compilateur et savoir ouvrir ses mirettes. Seulement voilà, magique, que tu écrives i < 0 ou bien i & 0xB0000000 (sur machine 32bits), le code objet est strictement le même

Reply

Marsh Posté le 16-09-2004 à 17:26:22    

Taz a écrit :

c'est quoi le problème avec le signe < ?
 
 
vu comment t'as l'air dégourdi, je doute que ce test minable soit le point chaud de ton application : mais si tu veux faire une merde non portable, bien illisible, stupide plutot de faire ce qu'un gamin de 3 ans fait intuitivement ...


 
ok bonhomme, excuse moi de parler devant DIEU :hello:


---------------
EurOPiUM, leader de WormsHL
Reply

Marsh Posté le 16-09-2004 à 17:29:10    

ben test le bit 31 de tes entier, mais faut vraiment avoir que ca a faire

Reply

Marsh Posté le 16-09-2004 à 17:40:00    

europium a écrit :

ok bonhomme, excuse moi de parler devant DIEU :hello:


 
Non, Dieu t'aurait aussi parlé de complément à 2 (ce qui n'est pas le cas de toutes les machines), et Dieu parlant couramment l'hexa, il aurait utilisé 0x80000000 plutôt que 0xB000000000. Mais Dieu ne répond à aucune questions de C++ ici, alors que Taz, oui.
 
Si on veux comparer que N nombres ont le même signe, je crois qu'on  peux faire ça, non ?

Code :
  1. unsigned int iMask = 0x8000000000;
  2. unsigned int iOr = 0;
  3. unsigned int iAnd = iMask;
  4. for (int i=0;i<nombres.size(); ++i)
  5. {
  6.   iOr  |= nombres[i];
  7.   iAnd &= nombres[i];
  8. }
  9. bool allSameSign = (iOr&iMask) == iAnd;
  10. }


Reply

Marsh Posté le 16-09-2004 à 17:43:15    

bon ben tu n'as qu'a te faire une fonction qui te retourne un booleen du genre :  
 
inline bool estPositif(int ton_entier) // strict ici
{
   // voir suivant tes besoins pour le cas == 0
   return (ton_entier > 0);
}
 
puisque tu veux eviter des cascades de if dans ton code.  
(si j'ai compris correctement ce que tu voulais faire, ce qui peut être faux aussi...)

Reply

Marsh Posté le 16-09-2004 à 17:44:19    

PtitKiKi a écrit :

bon ben tu n'as qu'a te faire une fonction qui te retourne un booleen du genre :  
 
inline bool estPositif(int ton_entier) // strict ici
{
   // voir suivant tes besoins pour le cas == 0
   return (ton_entier > 0);
}
 
puisque tu veux eviter des cascades de if dans ton code.  
(si j'ai compris correctement ce que tu voulais faire, ce qui peut être faux aussi...)


à part rajouter un appel de fonction l'intérêt est où? [:wam]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 16-09-2004 à 17:49:30    

merci les gars  :)
prenez vous pas tant la tete sur ce pb à la con !
 
merci Lam's pour ton code, ca me plait, vais essayer de piger


---------------
EurOPiUM, leader de WormsHL
Reply

Marsh Posté le 16-09-2004 à 17:49:45    

skeye a écrit :

à part rajouter un appel de fonction l'intérêt est où? [:wam]


 
il l'a mis en inline :o

Reply

Marsh Posté le 16-09-2004 à 17:51:53    

il me semble qu'il voulait éviter d'ecrire systematiquement :
 
if(a > 0 || b < 0 && c > 0 ....)
 
et plutot avoir le résultat du test directement dans son expression "if"
 
maintenant j'ai peu etre mal compris la question...
jvois mal comment passer autrement que par un boolean pour répondre a la question "est-ce positif ?"
 
cf la question initiale :
 
"je voudrais savoir s'il est possible de le faire sans passer par une expression booleenne avec tous les cas... "
 

skeye a écrit :

à part rajouter un appel de fonction l'intérêt est où? [:wam]

Reply

Marsh Posté le 16-09-2004 à 17:57:54    

chrisbk a écrit :

ben test le bit 31 de tes entier, mais faut vraiment avoir que ca a faire

ben ça produit le même code tu sais alors ...

Reply

Marsh Posté le 16-09-2004 à 17:57:56    

Soit dit en passant, cette question est moins conne qu'elle n'en a l'air. Elle se rapporte au problème classique du : comment faire pour simplifier l'expression booléenne qui teste un ensemble de bits (le bit 31 de nos entiers dans le cas présent).
 
Et ça, les matrices de Karnaugh, elles savent faire ça très bien...
http://www.maxmon.com/kmaps1.htm
 
Mais ça commence à être un peu de l'artillerie lourde pour le problème en cours (surtout si on se met à écrire des fonctions inline pour remplacer les opérateurs du C  :lol: ).

Reply

Marsh Posté le 16-09-2004 à 18:24:31    

:| y a pas un issign ou chaiplus koi dans <limits> ou <algorithm> ?

Reply

Marsh Posté le 16-09-2004 à 18:35:07    

Joel F a écrit :

:| y a pas un issign ou chaiplus koi dans <limits> ou <algorithm> ?


 
Yup. numeric_limits<T>::is_signed()
 

Reply

Marsh Posté le 16-09-2004 à 18:35:18    

Surtout qu'on sait toujours pas ce qu'il veut foutre avec ses variables et pourquoi var < 0 ne lui va pas


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 16-09-2004 à 23:48:44    

Moi, quand j'ai besoin du signe, je fais un truc du genre :

Code :
  1. inline int signe(const double x)
  2. {
  3.   return (x < 0.) ? -1 : 1 ;
  4. }


 
Comme ça, par la suite, c'est facile de réassigner le signe par une bête multiplication, plutôt qu'en faisant un test sur un booléen dans lequel on stocke le signe.


Message édité par el muchacho le 16-09-2004 à 23:50:21
Reply

Marsh Posté le 27-11-2009 à 11:16:37    

Bonjour,
 
Je bats mon record de remonté de discussion :), mais comme celle-ci avait l'air bien chaude :P.
Ma question est :
ne peut on pas récupéré la "posivité", "négativité" d'une variable en faisant :

Code :
  1. bool sign = maVar<<1 //BIGENDIAN


Code :
  1. bool sign = maVar<<17 //LITTLEENDIAN


 
PS : Je savais pas que Dieu parlait couramment l'hexa ... C'est vraiment pas un bit MDR (Désolé craquage :cry:).

Reply

Marsh Posté le 27-11-2009 à 11:32:19    

non, jamais


---------------
last.fm
Reply

Marsh Posté le 27-11-2009 à 11:57:04    

Merci theshockwave. Au moins la réponse est clair ...
 
Entre mon post et la lecture de ta réponse, j'ai vu que je disais de la ...
 
Il faudrait en fait récupéré la valeur du dernier bit "tombé", soit le flag CF ... Mais je ne sais pas (encore) faire ...

Reply

Marsh Posté le 27-11-2009 à 14:05:12    

non, pas question de tester le carry pour ca. Comme ca a été dit plus haut, tu testes si ta valeur est inférieure à 0, les trucs de cowboy, ton compilateur sait très bien les faire. Même quand on cherche à avoir de bonnes perfs, on ne fait pas ce genre de choses parce que ca ne sert à rien. Qui plus est, little endian et big endian n'ont pas d'influence là-dessus à moins que tu saches que maVar n'est pas dans l'endianness de ta machine ce dont je doute fortement


---------------
last.fm
Reply

Marsh Posté le 27-11-2009 à 18:48:24    

clairement c'ets le genre d'optimisation qui sert strictement à rien ..

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed