recuperer le signe d'une variable - C++ - Programmation
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
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....
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
Marsh Posté le 16-09-2004 à 14:03:38
Nan mais c'est pas un peu compliqué tout ça ??
Code :
|
Marsh Posté le 16-09-2004 à 14:08:56
Marsh Posté le 16-09-2004 à 16:51:21
cricri_ a écrit : Nan mais c'est pas un peu compliqué tout ça ??
|
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 ?
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! |
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?
Marsh Posté le 16-09-2004 à 16:58:22
Ca... consiste en quoi... tes tests?
exactement
non parce que
Code :
|
ca marche achtement bien pour savoir si une variable est négative
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 ...
Marsh Posté le 16-09-2004 à 17:05:42
Taz a écrit : c'est quoi le problème avec le signe < ? |
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
Marsh Posté le 16-09-2004 à 17:26:22
Taz a écrit : c'est quoi le problème avec le signe < ? |
ok bonhomme, excuse moi de parler devant DIEU
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
Marsh Posté le 16-09-2004 à 17:40:00
europium a écrit : ok bonhomme, excuse moi de parler devant DIEU |
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 :
|
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...)
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 : |
à part rajouter un appel de fonction l'intérêt est où?
Marsh Posté le 16-09-2004 à 17:49:45
ReplyMarsh 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ù? |
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 ...
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 ).
Marsh Posté le 16-09-2004 à 18:24:31
:| y a pas un issign ou chaiplus koi dans <limits> ou <algorithm> ?
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()
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
Marsh Posté le 16-09-2004 à 23:48:44
Moi, quand j'ai besoin du signe, je fais un truc du genre :
Code :
|
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.
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 .
Ma question est :
ne peut on pas récupéré la "posivité", "négativité" d'une variable en faisant :
Code :
|
Code :
|
PS : Je savais pas que Dieu parlait couramment l'hexa ... C'est vraiment pas un bit MDR (Désolé craquage ).
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 ...
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
Marsh Posté le 27-11-2009 à 18:48:24
clairement c'ets le genre d'optimisation qui sert strictement à rien ..
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
---------------
EurOPiUM, leader de WormsHL