 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Jean-Michel Bechet Guest
|
Posted: Mon Aug 04, 2003 12:21 pm Post subject: Re: Tester "rapidement" a*b>0 |
|
|
"Marc Boyer" <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr> wrote
| Quote: | Auriez vous un truc portable pour tester rapidement si deux
valeurs sont de même signe ou pas ? Existe-il une fonction
"sign" qui permettrait de tester
sign(a)==sign(b)
sans envoyer une multiplication dans l'UAL ?
|
Un ou exclusif entre les deux valeurs => le bit de signe subsiste s'il y en
a juste 1 des 2 de positionné
=> résultat négatif : bits de signe différents
=> résultat positif (ou =0) : bits de signe les mêmes
if ((a^b)<0)
{
// signe différent
}
else
{
// même signe
}
ou bien
#define signequal(a,b) (((a)^(b))<0)?0:1
|
|
| Back to top |
|
 |
Marc Boyer Guest
|
Posted: Mon Aug 04, 2003 12:38 pm Post subject: Re: Tester "rapidement" a*b>0 |
|
|
Jean-Michel Bechet wrote:
| Quote: |
"Marc Boyer" <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr> wrote in message
news:bglclg$lo2$1 (AT) news (DOT) cict.fr...
Auriez vous un truc portable pour tester rapidement si deux
valeurs sont de même signe ou pas ? Existe-il une fonction
"sign" qui permettrait de tester
sign(a)==sign(b)
sans envoyer une multiplication dans l'UAL ?
Un ou exclusif entre les deux valeurs => le bit de signe subsiste s'il y en
a juste 1 des 2 de positionné
=> résultat négatif : bits de signe différents
=> résultat positif (ou =0) : bits de signe les mêmes
|
OK, ça marcha dans une représentation en complément
à deux, mais est-ce la seule acceptée par C++ ?
Je sais que C accepte 2 autres représentations (pas
la ref sous la main).
Par contre, ça marche que si les types sont signés.
Ce serait bien si ça marchait aussi pour les types
"unsigned" (sinon, c'est pas grave)...
| Quote: | #define signequal(a,b) (((a)^(b))<0)?0:1
|
Je prends note, merci.
Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(
|
|
| Back to top |
|
 |
Laurent Deniau Guest
|
Posted: Mon Aug 04, 2003 12:40 pm Post subject: Re: Tester "rapidement" a*b>0 |
|
|
Marc Boyer wrote:
| Quote: | Auriez vous un truc portable pour tester rapidement si deux
valeurs sont de même signe ou pas ? Existe-il une fonction
"sign" qui permettrait de tester
sign(a)==sign(b)
sans envoyer une multiplication dans l'UAL ?
Merci,
Marc Boyer
|
a<0 == b<0
ca convient?
a+, ld.
--
[ Laurent Deniau -- Scientific Computing & Data Analysis ]
[ CERN -- European Center for Nuclear Research ]
[ [email]Laurent.Deniau (AT) cern (DOT) ch[/email] - http://cern.ch/Laurent.Deniau ]
[ -- One becomes old when dreams become regrets -- ]
|
|
| Back to top |
|
 |
Marc Boyer Guest
|
Posted: Mon Aug 04, 2003 12:57 pm Post subject: Re: Tester "rapidement" a*b>0 |
|
|
In article <3f2e57d8$0$27010$626a54ce (AT) news (DOT) free.fr>, Julien Blanc wrote:
| Quote: | Marc Boyer wrote:
Par contre, ça marche que si les types sont signés.
Ce serait bien si ça marchait aussi pour les types
"unsigned" (sinon, c'est pas grave)...
tu veux tester si deux entiers non signés sont du même signe ???
|
J'écris un code template qui sera utilisé avec des entiers
signés en non signé, et j'aimerais garder le code simple...
Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(
|
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
Posted: Mon Aug 04, 2003 1:07 pm Post subject: Re: Tester "rapidement" a*b>0 |
|
|
Marc Boyer <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr> writes:
| Quote: | Jean-Michel Bechet wrote:
"Marc Boyer" <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr> wrote in message
news:bglclg$lo2$1 (AT) news (DOT) cict.fr...
Auriez vous un truc portable pour tester rapidement si deux
valeurs sont de même signe ou pas ? Existe-il une fonction
"sign" qui permettrait de tester
sign(a)==sign(b)
sans envoyer une multiplication dans l'UAL ?
|
Quel est le signe de 0 ?
| Quote: | Un ou exclusif entre les deux valeurs => le bit de signe subsiste s'il y en
a juste 1 des 2 de positionné
=> résultat négatif : bits de signe différents
=> résultat positif (ou =0) : bits de signe les mêmes
OK, ça marcha dans une représentation en complément
à deux, mais est-ce la seule acceptée par C++ ?
|
Non, mais ca marche aussi avec du complément à un et avec une
représentation grandeur et signe (ces deux représentations ayant un 0
signé, ca fait ce qu'il faut).
Le seul problème que je vois c'est sur les architectures où des bits
ont une valeur fixée pour les entiers si cette valeur n'est pas 0 ou
si le -0 est interdit (ce qui est le cas me semble t'il sur certaine
machine en complément à 1).
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
|
|
| Back to top |
|
 |
Jean-Michel Bechet Guest
|
Posted: Mon Aug 04, 2003 1:49 pm Post subject: Re: Tester "rapidement" a*b>0 |
|
|
| Quote: |
a<0 == b<0
ca convient?
|
c'est joli ça; j'y avais pas pensé !!!
|
|
| Back to top |
|
 |
Laurent Deniau Guest
|
Posted: Mon Aug 04, 2003 4:08 pm Post subject: Re: Tester "rapidement" a*b>0 |
|
|
Fabien LE LEZ wrote:
| Quote: | On Mon, 04 Aug 2003 14:40:56 +0200, Laurent Deniau
[email]Laurent.Deniau (AT) cern (DOT) ch[/email]> wrote:
a<0 == b<0
ca convient?
Sous réserve qu'on gère correctement le cas a==0 et/ou b==0.
|
cela suppose que sign(0) == sign(-0) quelque soit la promotion valide de 0.
on retombe sur l'eternel probleme de la double representation du zero dans les
nombres flottants.
mais cela a l'avantage de comparer le signe de a et b meme s'ils sont de types
differents.
pour traiter le cas, peut-etre qu'un
if (0.0 == -0.0)
throw logic_error();
else
return a<0 == b<0;
detectera le probleme au runtime, ou le validera a la compilation.
a+, ld.
--
[ Laurent Deniau -- Scientific Computing & Data Analysis ]
[ CERN -- European Center for Nuclear Research ]
[ [email]Laurent.Deniau (AT) cern (DOT) ch[/email] - http://cern.ch/Laurent.Deniau ]
[ -- One becomes old when dreams become regrets -- ]
|
|
| Back to top |
|
 |
Sylvain Togni Guest
|
Posted: Mon Aug 04, 2003 4:41 pm Post subject: Re: Tester "rapidement" a*b>0 |
|
|
"Marc Boyer" <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr> a écrit:
| Quote: | In article <3F2E5458.6070007 (AT) cern (DOT) ch>, Laurent Deniau wrote:
Marc Boyer wrote:
a<0 == b<0
Elegant, voilà le mot que je cherchais.
|
Oui mais pas forcement très rapide. Sur ma machine par exemple
(PIII 600, VC6) c'est presque deux fois plus lent que a*b>0 :
a*b>0 5.46 ns
(a^b)<0 5.04 ns
a<0 == b<0 10.31 ns
Sylvain
|
|
| Back to top |
|
 |
Marc Boyer Guest
|
Posted: Tue Aug 05, 2003 8:28 am Post subject: Re: Tester "rapidement" a*b>0 |
|
|
Sylvain Togni wrote:
| Quote: | "Marc Boyer" <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr> a écrit:
In article <3F2E5458.6070007 (AT) cern (DOT) ch>, Laurent Deniau wrote:
Marc Boyer wrote:
a<0 == b<0
Elegant, voilà le mot que je cherchais.
Oui mais pas forcement très rapide. Sur ma machine par exemple
(PIII 600, VC6) c'est presque deux fois plus lent que a*b>0 :
a*b>0 5.46 ns
(a^b)<0 5.04 ns
a<0 == b<0 10.31 ns
|
Mauvais compilateur, changer compilateur ;-)
| Quote: | gcc -02
a*b<0(ns) 7 |
a^b<0(ns) 6
a<0 == b<0 3
Sur un pentium (i686) dont je ne connais pas la fréquence.
Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(
|
|
| Back to top |
|
 |
Julien Blanc Guest
|
Posted: Tue Aug 05, 2003 8:36 am Post subject: Re: Tester "rapidement" a*b>0 |
|
|
Marc Boyer wrote:
| Quote: | Sylvain Togni wrote:
"Marc Boyer" <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr> a écrit:
In article <3F2E5458.6070007 (AT) cern (DOT) ch>, Laurent Deniau wrote:
Marc Boyer wrote:
a<0 == b<0
Elegant, voilà le mot que je cherchais.
Oui mais pas forcement très rapide. Sur ma machine par exemple
(PIII 600, VC6) c'est presque deux fois plus lent que a*b>0 :
a*b>0 5.46 ns
(a^b)<0 5.04 ns
a<0 == b<0 10.31 ns
Mauvais compilateur, changer compilateur ;-)
gcc -02
a*b<0(ns) 7
a^b<0(ns) 6
a<0 == b<0 3
Sur un pentium (i686) dont je ne connais pas la fréquence.
|
a*b>0
ce truc là se teste en une instruction (du moins il me semble) sur ARM,
et les deux autres je suis pratiquement sûr que non.
Mauvaise architecture, changer d'architecture ? ;)
--
Julien Blanc. Equipe cadp. VERIMAG. Grenoble. France.
|
|
| Back to top |
|
 |
Frederic Py Guest
|
Posted: Tue Aug 05, 2003 8:48 am Post subject: Re: Tester "rapidement" a*b>0 |
|
|
Laurent Deniau wrote:
| Quote: | Fabien LE LEZ wrote:
On Mon, 04 Aug 2003 14:40:56 +0200, Laurent Deniau
[email]Laurent.Deniau (AT) cern (DOT) ch[/email]> wrote:
a<0 == b<0
ca convient?
Sous réserve qu'on gère correctement le cas a==0 et/ou b==0.
cela suppose que sign(0) == sign(-0) quelque soit la promotion valide de 0.
on retombe sur l'eternel probleme de la double representation du zero
dans les nombres flottants.
mais cela a l'avantage de comparer le signe de a et b meme s'ils sont de
types differents.
pour traiter le cas, peut-etre qu'un
if (0.0 == -0.0)
throw logic_error();
else
return a<0 == b<0;
detectera le probleme au runtime, ou le validera a la compilation.
|
Je dit peut etre n'importe quoi mais pourquoi ne pas exploiter un truc
du genre STATIC_CHECK plutot ?
--
Frederic Py
|
|
| Back to top |
|
 |
Marc Boyer Guest
|
Posted: Tue Aug 05, 2003 8:55 am Post subject: Re: Tester "rapidement" a*b>0 |
|
|
In article <opllgb.uf.ln (AT) news (DOT) bourguet.org>, Jean-Marc Bourguet wrote:
| Quote: | Marc Boyer <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr> writes:
Jean-Michel Bechet wrote:
"Marc Boyer" <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr> wrote in message
news:bglclg$lo2$1 (AT) news (DOT) cict.fr...
Auriez vous un truc portable pour tester rapidement si deux
valeurs sont de même signe ou pas ? Existe-il une fonction
"sign" qui permettrait de tester
sign(a)==sign(b)
sans envoyer une multiplication dans l'UAL ?
Quel est le signe de 0 ?
|
Le cas 0 ne m'intéresse pas dans le problème donné
(même si ça peut être amusant d'en parler sur fclc++).
| Quote: | OK, ça marcha dans une représentation en complément
à deux, mais est-ce la seule acceptée par C++ ?
Non, mais ca marche aussi avec du complément à un et avec une
représentation grandeur et signe (ces deux représentations ayant un 0
signé, ca fait ce qu'il faut).
|
Top.
Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(
|
|
| Back to top |
|
 |
Marc Boyer Guest
|
Posted: Tue Aug 05, 2003 9:02 am Post subject: Re: Tester "rapidement" a*b>0 |
|
|
Julien Blanc wrote:
| Quote: | Marc Boyer wrote:
Sylvain Togni wrote:
"Marc Boyer" <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr> a écrit:
In article <3F2E5458.6070007 (AT) cern (DOT) ch>, Laurent Deniau wrote:
a*b>0
ce truc là se teste en une instruction (du moins il me semble) sur ARM,
et les deux autres je suis pratiquement sûr que non.
Mauvaise architecture, changer d'architecture ?
|
On trouvera toujours un cas ou telle architecture est meilleure
que telle autre dans tel cas.
Je tentais juste de trouver un code C++ qui soit globalement
efficace.
Et bon, un *bon* compilateur pour ARM transformera
le test a<0 == b<0 en l'instruction qui fait tout en
une seule opération, non ?
Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(
|
|
| Back to top |
|
 |
Julien Blanc Guest
|
Posted: Tue Aug 05, 2003 9:18 am Post subject: Re: Tester "rapidement" a*b>0 |
|
|
Marc Boyer wrote:
| Quote: | On trouvera toujours un cas ou telle architecture est meilleure
que telle autre dans tel cas.
Je tentais juste de trouver un code C++ qui soit globalement
efficace.
Et bon, un *bon* compilateur pour ARM transformera
le test a<0 == b<0 en l'instruction qui fait tout en
une seule opération, non ?
|
tu as une notion de /bon/ assez exigeante avec le compilateur, mais
globalement nous sommes d'acord. Mais dans ce cas là, ne crois-tu pas
non plus que le *bon* compilateur transformera le a*b>0 en a<0 == b<0 si
c'est mieux ? (ça ne me parait pas concrètement plus dur dans un sens
que dans l'autre).
Enfin bref, j'étais plus taquin avec ta remarque sur le compilateur
qu'autre chose, je te l'accorde .
--
Julien Blanc. Equipe cadp. VERIMAG. Grenoble. France.
|
|
| Back to top |
|
 |
Julien Blanc Guest
|
Posted: Tue Aug 05, 2003 12:09 pm Post subject: Re: Tester "rapidement" a*b>0 |
|
|
Gabriel Dos Reis wrote:
| Quote: | Julien Blanc <Julien.Blanc (AT) imag (DOT) fr> writes:
| Marc Boyer wrote:
|
| > On trouvera toujours un cas ou telle architecture est meilleure
| > que telle autre dans tel cas.
| > Je tentais juste de trouver un code C++ qui soit globalement
| > efficace.
| > Et bon, un *bon* compilateur pour ARM transformera
| > le test a<0 == b<0 en l'instruction qui fait tout en
| > une seule opération, non ?
|
| tu as une notion de /bon/ assez exigeante avec le compilateur,
Nous sommes en train de parler de C++, non ?
|
justement ;)
(ceci étant purement de mauvaise foi, je l'accorde. Mais en
l'occurrence, je ne vois pas trop en quoi ce type d'optimisation est
dépendante d'un langage ou d'un autre).
--
Julien Blanc. Equipe cadp. VERIMAG. Grenoble. France.
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|