Article View: fr.comp.lang.c
Article #15477Re: conjugaison et autres exos sur les chaines [Was : Un système de conj...]
From: Antoine Leca
Date: Thu, 22 Sep 2005 15:00
Date: Thu, 22 Sep 2005 15:00
96 lines
6017 bytes
6017 bytes
En <news:mn.b3997d59480be176.31483@laposte.net>,
Pierre Maurette va escriure:
> Je savais que le passage par les double �tait foireux, je suis all� au
> plus rapide en utilisant un truc abominable, j'ai test� aux limites
> :-(
Avec quelle machine, quelle compilo, quelle libc ?
Chez moi (P4, gcc/MingW, MSVCRT, en magouillant pour utiliser les double et
sqrt()), c'est off by 1...
> const uintmax_t borne =
> UINTMAX_MAX >> (sizeof(UINTMAX_MAX) * CHAR_BIT / 2);
>
> Je ne sais pas si c'est toujours bon.
C'est nettement moins mauvais. Cela va foir� sur une machine avec un num�ro
impair de bits, mais je ne pense pas que ce soit un souci. Cela va foirer
aussi sur une machine qui a des bits inutilis� (en d'autres termes,
sizeof(uintmax_t)*CHAR_BIT n'est PAS le nombre de bits significatifs, il y
aurait du remplissage interne); pas courant du tout, mais cela peut arriver.
> Il faut quand m�me se rappeler que l'existaence d'un type de
> <inttypes.h> induit des garanties quant � son format.
> Pas de padding, et compl�ment � 2 pour les sign�s.
SEULEMENT pour les types intN_t. Les autres, intmax_t ou uint_atleastN_t
etc., n'ont pas ces contraintes et poeuvent ne pas les respecter. Quant aux
machines qui ne remplissent pas les contraintes (genre PDP-10 ou Unisys), il
leur suffit de ne _pas_ fournir les types intN_t, ce qui fera foirer les
programmes qui exigent/s'attendent � une machine � r�guli�re �.
>> Tu peux faire la m�me chose avec
>> pvaleur+=strcpsn(pvaleur, "- \f\n\r\t\v");
>> L'avantage, c'est que comme ce n'est pas � �vident �, tu te sens
>> oblig� de mettre un commentaire, qui pourrait faire comprendre
>> l'utilit� de cette op�ration (il se trouve que j'ai une id�e du
>> pourquoi, mais pas forc�ment tous ceux qui nous lisent).
> Certes. C'�tait un peu un gag.
strcspn() (oui, c'�tait un gag, mais de ma part) ou le test pour supprimer
le signe - (qui a son importance, si tu le sautes cela va faire des trucs
bizarres.)
>>> entier = strtoumax(pvaleur, NULL, 0);
>>
> Je me suis tromp� sur le sens du 0, j'aurais
> du utiliser 10, et modifier d'ailleurs le texte dans usage().
Il faut utiliser le second param�tre, et agir si strtoxxx() n'a pas su
convertir la totalit� de l'argument...
>>> if(errno || (entier > borne))
>>> puts("Oh my God, c'est h�naurme !");
>>
>> Ou bien sqrtl a eu un probl�me...
> Oui. J'ai �t� tent� par un if ((errno == ERANGE)...
Mauvaise id�e.
D'abord, si tu veux utiliser errno, en dehors d'#inclure <errno.h> sinon �a
hurle, il faut toujours le remettre � 0 avant l'op�ration que tu veux
tester. On ne sait jamais ce qui peux tra�ner, ici l'appel ant�rieur �
sqrt() semble inoffensif mais ...
Ensuite, ne pr�suppose jamais que l'impl�mentation va respecter la norme si
par ailleurs tu peux �crire un code � peine diff�rent (ici, ne _pas_ tester
sp�cifquement ERANGE) qui peut rattraper au passage des petites
variations... donc exit le == ERANGE.
Enfin, en l'occurence le test de errno n'apporte rien: en cas de
d�bordement, strtoxxx() va renvoyer UINTmachin_MAX, qui va faire sauter le
cocotier de l'autre c�t�. Et le cas o� la conversion a loup� compl�tement
(return 0) n'est pas sens� positionner errno d'apr�s la norme (genre de cas
o� tu as une chance sur trois d'avoir l'impl�mentation qui se gourre).
>> � propos, que donne ton programme sur ta machine pour icarre
>> 4294967296 ?
> Pourquoi ? Il me donne ce que j'attendais, c'est � dire :
> Oh my God, c'est hainaurme !
Bon. Alors essaye de remplacer ton code par
const uintmax_t borne = sqrt((double)UINTMAX_MAX);
>> Exercice compl�mentaire pour ceux qui n'ont rien �
>> faire : Expliquer pourquoi. ;-)
Antoine
Technical Details
Message-ID:
<dgugtk$gr9$1@shakotay.alphanet.ch>Path:
arc1-ca.pugleaf.net!g2news1.google.com!news3.google.com!border1.nntp.dca.giganews.com!nntp.giganews.com!news.moat.net!news.imp.ch!news.imp.ch!80.83.46.147.MISMATCH!news.alphanet.ch!alphanet.ch!not-for-mailReferences:
<1126342327.583568.21420@g43g2000cwa.googlegroups.com> <4329e5d4$0$7846$8fcfb975@news.wanadoo.fr> <dge4b6$fqa$1@reader1.imaginet.fr> <mn.837a7d59123d924a.15512@YOURBRAnoos.fr> <432adddf$0$17220$8fcfb975@news.wanadoo.fr> <mn.84407d597cfa6e6e.15512@YOURBRAnoos.fr> <432b2a92$0$7861$8fcfb975@news.wanadoo.fr> <432c19e0$0$1710$8fcfb975@news.wanadoo.fr> <432cad90$0$27422$8fcfb975@news.wanadoo.fr> <432d1b7c$0$1743$8fcfb975@news.wanadoo.fr> <432d3117$0$1742$8fcfb975@news.wanadoo.fr> <mn.93877d590449a7bc.15512@YOURBRAnoos.fr> <432d7667$0$17248$8fcfb975@news.wanadoo.fr> <mn.94047d599f0cc076.15512@YOURBRAnoos.fr> <432da70c$0$1735$8fcfb975@news.wanadoo.fr> <mn.94c47d590202e83a.15512@YOURBRAnoos.fr> <43315679$0$27421$8fcfb975@news.wanadoo.fr> <mn.ad0b7d59687aaf3b.31483@laposte.net> <dgu24d$ma4$1@shakotay.alphanet.ch> <mn.b3997d59480be176.31483@laposte.net>Show Full Headers
Complete Article Headers
X-Google-Thread: f9822,b21b26167a936e28 X-Google-Attributes: gidf9822,public X-Google-Language: FRENCH,ASCII Path: arc1-ca.pugleaf.net!g2news1.google.com!news3.google.com!border1.nntp.dca.giganews.com!nntp.giganews.com!news.moat.net!news.imp.ch!news.imp.ch!80.83.46.147.MISMATCH!news.alphanet.ch!alphanet.ch!not-for-mail From: "Antoine Leca" <root@localhost.invalid> Newsgroups: fr.comp.lang.c Subject: Re: conjugaison et autres exos sur les chaines [Was : Un système de conj...] Date: Thu, 22 Sep 2005 17:00:01 +0200 Organization: Posted through ALPHANET (http://www.alphanet.ch/) Lines: 97 Sender: antoinel@143.red-217-127-250.staticip.rima-tde.net Message-ID: <dgugtk$gr9$1@shakotay.alphanet.ch> References: <1126342327.583568.21420@g43g2000cwa.googlegroups.com> <4329e5d4$0$7846$8fcfb975@news.wanadoo.fr> <dge4b6$fqa$1@reader1.imaginet.fr> <mn.837a7d59123d924a.15512@YOURBRAnoos.fr> <432adddf$0$17220$8fcfb975@news.wanadoo.fr> <mn.84407d597cfa6e6e.15512@YOURBRAnoos.fr> <432b2a92$0$7861$8fcfb975@news.wanadoo.fr> <432c19e0$0$1710$8fcfb975@news.wanadoo.fr> <432cad90$0$27422$8fcfb975@news.wanadoo.fr> <432d1b7c$0$1743$8fcfb975@news.wanadoo.fr> <432d3117$0$1742$8fcfb975@news.wanadoo.fr> <mn.93877d590449a7bc.15512@YOURBRAnoos.fr> <432d7667$0$17248$8fcfb975@news.wanadoo.fr> <mn.94047d599f0cc076.15512@YOURBRAnoos.fr> <432da70c$0$1735$8fcfb975@news.wanadoo.fr> <mn.94c47d590202e83a.15512@YOURBRAnoos.fr> <43315679$0$27421$8fcfb975@news.wanadoo.fr> <mn.ad0b7d59687aaf3b.31483@laposte.net> <dgu24d$ma4$1@shakotay.alphanet.ch> <mn.b3997d59480be176.31483@laposte.net> NNTP-Posting-Host: 143.red-217-127-250.staticip.rima-tde.net Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-15" Content-Transfer-Encoding: 8bit X-Trace: shakotay.alphanet.ch 1127401205 17257 217.127.250.143 (22 Sep 2005 15:00:05 GMT) X-Complaints-To: usenet@alphanet.ch NNTP-Posting-Date: Thu, 22 Sep 2005 15:00:05 +0000 (UTC) X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2800.1506 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1506