<HTML> <!--This file created 3/09/98 11:11 by Claris Home Page version 3.0--> <HEAD>    <TITLE>Arrondis sur ordinateur</TITLE>    <X-CLARIS-WINDOW TOP=63 BOTTOM=715 LEFT=109 RIGHT=761>    <X-CLARIS-TAGVIEW MODE=minimal> </HEAD> <BODY BGCOLOR="#FFFFFF"> <CENTER><FONT SIZE="+4" COLOR="#336666"><B>Ordinateur et arrondis </B></FONT></CENTER>  <P><A NAME=perte></A> <IMG SRC="../cgif/tetra.gif" X-CLARIS-USEIMAGEWIDTH X-CLARIS-USEIMAGEHEIGHT ALIGN=middle width="24" height="24"><FONT SIZE="+1" COLOR="#993300">Perte de chiffres significatifs : </FONT><FONT SIZE="+1">Pour comprendre le probl&egrave;me, il nous faut &eacute;tudier le codage des nombres (syst&egrave;me binaire) : un <I>bit</I> est un emplacement m&eacute;moire &eacute;l&eacute;mentaire (de l'anglais <I>binary digit</I>) .Il peut &ecirc;tre activ&eacute; (charg&eacute; &eacute;lectriquement) : on dit qu'il est &agrave; l'&eacute;tat 1, ou non activ&eacute; (non charg&eacute;): il est &agrave; l'&eacute;tat z&eacute;ro. C'est le principe du syst&egrave;me binaire (&eacute;criture en base 2).</FONT></P>  <P><FONT SIZE="+1">Tout nombre peut s'&eacute;crire en base 2 au seul moyen des symboles (chiffres) 0 et 1. L'&eacute;criture cherch&eacute;e s'obtient par </FONT><A HREF="../chrono1/Euclide.html#div"><FONT SIZE="+1">divisions euclidiennes</FONT></A><FONT SIZE="+1"> successives par 2 tant que le quotient n'est pas 1. Par exemple,</FONT><FONT SIZE="+1" FACE="Times"> le </FONT><FONT SIZE="+1">nombre 19 :</FONT></P>  <CENTER><TABLE BORDER=0>    <TR BGCOLOR="#FFFFCC">       <TD BGCOLOR="#FFCC99">          <P><FONT SIZE="+1" FACE="Times">19 / 2&nbsp;</FONT></P>       </TD>       <TD BGCOLOR="#CCFFFF">          <P><FONT SIZE="+1" FACE="Times">&nbsp;&nbsp;q =          9&nbsp;</FONT></P>       </TD>       <TD>          <P><FONT SIZE="+1" FACE="Times">&nbsp;&nbsp;r = <B>1</B>          </FONT><FONT SIZE="-1" FACE="Times">(parit&eacute;, r = 1,          nombre impair)</FONT></P>       </TD>    </TR>    <TR BGCOLOR="#FFFFCC">       <TD BGCOLOR="#FFCC99">          <P><FONT SIZE="+1" FACE="Times">9 / 2&nbsp;</FONT></P>       </TD>       <TD BGCOLOR="#CCFFFF">          <P><FONT SIZE="+1" FACE="Times">&nbsp;&nbsp;q =          4&nbsp;</FONT></P>       </TD>       <TD>          <P><FONT SIZE="+1" FACE="Times">&nbsp;&nbsp;r =          <B>1</B></FONT></P>       </TD>    </TR>    <TR BGCOLOR="#FFFFCC">       <TD BGCOLOR="#FFCC99">          <P><FONT SIZE="+1" FACE="Times">4 / 2&nbsp;</FONT></P>       </TD>       <TD BGCOLOR="#CCFFFF">          <P><FONT SIZE="+1" FACE="Times">&nbsp;&nbsp;q =          2&nbsp;</FONT></P>       </TD>       <TD>          <P><FONT SIZE="+1" FACE="Times">&nbsp;&nbsp;r =          <B>0</B></FONT></P>       </TD>    </TR>    <TR BGCOLOR="#FFFFCC">       <TD BGCOLOR="#FFCC99">          <P><FONT SIZE="+1" FACE="Times">2 / 2&nbsp;</FONT></P>       </TD>       <TD BGCOLOR="#CCFFFF">          <P><FONT SIZE="+1" FACE="Times">&nbsp;&nbsp;q =          <B>1&nbsp;</B></FONT></P>       </TD>       <TD>          <P><FONT SIZE="+1" FACE="Times">&nbsp;&nbsp;r =          <B>0</B>&nbsp;</FONT><FONT SIZE="-1" FACE="Times">(4&egrave;          division, 19 est de l'ordre de 2<SUP>4</SUP> =          16)</FONT></P>       </TD>    </TR> </TABLE> </CENTER>  <P><FONT SIZE="+1">C'est dire que : </FONT></P>  <CENTER><FONT SIZE="+1">19 = 2<SUP>4</SUP> + 0 </FONT><FONT SIZE="+1" FACE="Arial">x</FONT><FONT SIZE="+1"> 2<SUP>3</SUP> + 0 </FONT><FONT SIZE="+1" FACE="Arial">x</FONT><FONT SIZE="+1"> 2<SUP>2</SUP> + 1 </FONT><FONT SIZE="+1" FACE="Arial">x</FONT><FONT SIZE="+1"> 2<SUP>1</SUP> + 1 </FONT><FONT SIZE="+1" FACE="Arial">x</FONT><FONT SIZE="+1"> 2<SUP>0</SUP> </FONT>  <P><FONT SIZE="+1">donc 19<SUB>base 10</SUB> = 10011<SUB>base 2</SUB></FONT></P></CENTER>  <P><FONT SIZE="+1">Supposons un ordinateur ne travaillant que sur 5 bits, le bit le plus "&agrave; gauche" &eacute;tant le bit de signe, il ne reste que 4 bits pour les chiffres significatifs. Les donn&eacute;es sont transmises entre m&eacute;moire et microprocesseur par l'interm&eacute;diaire de circuits &eacute;lectroniques : on parle de <I>bus de donn&eacute;es</I>.</FONT> <FONT SIZE="+1">Le nombre positif maximum sera obtenu avec des 1 partout, soit :</FONT></P>  <CENTER><FONT SIZE="+1">1 </FONT><FONT SIZE="+1" FACE="Arial">x</FONT><FONT SIZE="+1"> 2<SUP>3</SUP> + 1 </FONT><FONT SIZE="+1" FACE="Arial">x</FONT><FONT SIZE="+1"> 2<SUP>2</SUP> + 1 </FONT><FONT SIZE="+1" FACE="Arial">x</FONT><FONT SIZE="+1"> 2<SUP>1</SUP> + 1 </FONT><FONT SIZE="+1" FACE="Arial">x</FONT><FONT SIZE="+1"> 2<SUP>0</SUP></FONT>  <P><FONT SIZE="+1">soit : 1111<SUB>base 2</SUB> = 15<SUB>base 10</SUB></FONT></P></CENTER>  <P><FONT SIZE="+1">Ci-dessous, le nombre +13 en base 10 :</FONT></P>  <CENTER> <IMG SRC="an1gif/Arrondis1.gif" X-CLARIS-USEIMAGEWIDTH X-CLARIS-USEIMAGEHEIGHT ALIGN=bottom width="140" height="128"></CENTER>  <P><FONT SIZE="+1">Dans toute la suite, pour &eacute;viter des confusions, le bit de signe (0 si positif ou nul, 1 si n&eacute;gatif) sera s&eacute;par&eacute; des autres, constituant la mantisse, par le signe | (barre verticale). </FONT></P>  <P><FONT SIZE="+1">Le probl&egrave;me est de savoir distinguer un entier positif d'un entier n&eacute;gatif et, ayant trouv&eacute; une convention, quelle sera la capacit&eacute; de traitement de la machine.<BR> <BR> </FONT> <IMG SRC="../cgif/tetra.gif" X-CLARIS-USEIMAGEWIDTH X-CLARIS-USEIMAGEHEIGHT ALIGN=middle width="24" height="24"><FONT SIZE="+1" COLOR="#CC0000">Le compl&eacute;ment &agrave; 2 :</FONT><FONT SIZE="+1"> 5 s'&eacute;crivant 0 | 0101, son oppos&eacute; -5 doit s'&eacute;crire 1 | abcd o&ugrave; a, b, c et d sont &eacute;l&eacute;ments de {0,1}, de sorte que l'addition binaire de ces codes fournisse<BR> 0 | 0000. Il suffit d'&eacute;changer les 1 en 0 et d'ajouter (binairement) 1 : c'est ce que l'on appelle le <I>compl&eacute;ment &agrave; 2</I>.</FONT></P>  <P><FONT SIZE="+1">En effet, l'&eacute;change place des 1 partout dans la mantisse et l'ajout de 1 annule cette mantisse en produisant une addition binaire 1 + 1 = 10 (2 en binaire) dans le bit de signe qui devient 0 avec une retenue de 1, dont l'ordinateur est "pri&eacute;" de ne pas tenir compte : l'entier n&eacute;gatif -5 s'&eacute;crit aini 1 | 1010 + 1 = 1 | 1011 , donc -5 + 5 = 0 | 0000.</FONT></P>  <P><FONT SIZE="+1">Autres exemples :</FONT></P>  <CENTER><FONT SIZE="+2"><TABLE BORDER=0 BGCOLOR="#CCFFFF">    <TR>       <TD>          <CENTER><FONT SIZE="+1" COLOR="#CC3300">15 = 0 |          111</FONT><FONT SIZE="+2" COLOR="#CC3300">&nbsp;</FONT></CENTER>       </TD>       <TD>          <CENTER><FONT SIZE="+1" COLOR="#CC3300">&nbsp;-15 = 1 |          0000+1 = 1 | 0001</FONT></CENTER>       </TD>    </TR>    <TR>       <TD>          <CENTER><FONT SIZE="+1" COLOR="#CC3300">&nbsp;1 = 0 |          0001</FONT></CENTER>       </TD>       <TD>          <CENTER><FONT SIZE="+1" COLOR="#CC3300">-1 = 1 | 1110 +1 = 1          | 1111</FONT></CENTER>       </TD>    </TR>    <TR>       <TD>          <CENTER><FONT SIZE="+1" COLOR="#CC3300">16 = 15 + 1 = 0 |          1111 + 0 | 0001 </FONT>           <P><FONT SIZE="+1" COLOR="#CC3300">= 1 |          0000</FONT></P></CENTER>       </TD>       <TD>          <CENTER><FONT SIZE="+1" COLOR="#CC3300">-16 = -15 + (-1) = 1          | 0001 + 1 | 1111 &nbsp;&nbsp;&nbsp;</FONT>           <P><FONT SIZE="+1" COLOR="#CC3300">= 1 |          0000</FONT></P></CENTER>       </TD>    </TR> </TABLE>  </FONT><FONT SIZE="+1"> </FONT></CENTER>  <P><FONT SIZE="+1">On a un probl&egrave;me en derni&egrave;re ligne : 16 = -16. L'ordinateur v&eacute;rifie le bit de signe dans 16 = 15 + 1. On aurait d&ucirc; avoir un positif, donc il d&eacute;clare overflow (d&eacute;passement de capacit&eacute;).</FONT></P>  <P><A NAME=lng></A> <IMG SRC="../cgif/main.gif" X-CLARIS-USEIMAGEWIDTH X-CLARIS-USEIMAGEHEIGHT ALIGN=bottom width="32" height="16"><FONT SIZE="+1" COLOR="#990000">&nbsp;En conclusion :</FONT><FONT SIZE="+1"> avec 4 positions on peut calculer jusqu'&agrave; 1111 (base 2) = 15 (base 10) en positif et -16 (base 10) en n&eacute;gatif.Il suit qu'avec un bus de donn&eacute;es de 16 fils (2 octets) dont un bit pour le bit de signe, soit 15 + 1 positions on ira jusqu'&agrave; :</FONT></P>  <CENTER><FONT SIZE="+1" COLOR="#CC3300">0 | 1111111 | 11111111 </FONT></CENTER>  <P><FONT SIZE="+1">soit :<BR> </FONT></P>  <CENTER><FONT SIZE="+1">215 + 214 + ... + 23 + 22 + 2 + 1 = 32767 </FONT></CENTER>  <P><FONT SIZE="+1">et en n&eacute;gatif jusqu'&agrave; :</FONT></P>  <CENTER><FONT SIZE="+1">32767 - 1 = -32768</FONT></CENTER>  <P><FONT SIZE="+1" COLOR="#CC0000">Cons&eacute;quence :</FONT><FONT SIZE="+1"> Nagu&egrave;re, &eacute;crire en </FONT><A HREF="lang_basic.html"><FONT SIZE="+1">Basic</FONT></A><FONT SIZE="+1">, l'instruction : x% = 32800, provoquait une erreur puisque la variable x est d&eacute;clar&eacute;e enti&egrave;re (code %), mais x! = 32800 &eacute;tait accept&eacute;e car x est alors une variable simple pr&eacute;cision cod&eacute;e sur 4 octets (code !). En Turbo-Pascal, on aura la m&ecirc;me erreur si x est d&eacute;clar&eacute;e simplement <I>integer</I>. En </FONT><A HREF="lang_basic.html"><FONT SIZE="+1">Basic</FONT></A><FONT SIZE="+1">, x&amp; = 32800 est accept&eacute;e : variable enti&egrave;re "double pr&eacute;cision" (long integer, code &amp;) cod&eacute;e sur 4 octets (maximum : 2 147 483 647 = 2<SUP>31</SUP> - 1). Mais vous doublez ainsi la place m&eacute;moire occup&eacute;e par votre programme et vous augmentez &eacute;galement les temps de calcul. Les instructions DEFINT a-z et DEFLNG a-z ordonnent respectivement, en </FONT><A HREF="lang_basic.html"><FONT SIZE="+1">Basic</FONT></A><FONT SIZE="+1">, le calcul de toutes les variables en simple et double pr&eacute;cision.</FONT></P>  <P>Les "vieux" microprocesseurs dits "8 bits" avaient des bus de    transmission des informations (dialogue entre le microprocesseur    et ses p&eacute;riph&eacute;riques) de 16 bits : 8 pour le    transfert dans un sens et 8 pour le retour.<FONT SIZE="-1">    </FONT>Le bus de donn&eacute;es de ces ordinateurs monopolise 16    bits (soit deux octets, l'autoroute est &agrave; sens unique en    cas de transferts de donn&eacute;es num&eacute;riques). L'intel    80486 avait un bus de 32 bits et on en est maintenant &agrave; 64    bits, ce qui permet sur des ordinateurs et des langages    r&eacute;cents (<A HREF="../java_elem/lang_java.html">JavaScript</A>,    par exemple, de travailler par d&eacute;faut en "double    pr&eacute;cision" : 16 chiffres significatifs. <A HREF="../java_elem/ctes_math.html">Testez    le petit programme...</A></P>  <FONT SIZE="+1"><a name="hexa"></a> <IMG SRC="../cgif/main.gif" X-CLARIS-USEIMAGEWIDTH X-CLARIS-USEIMAGEHEIGHT ALIGN=bottom width="32" height="16"></FONT><font size="4">&nbsp; Il faut savoir que pour des raisons pratiques (simplification    de l'&eacute;criture), les informaticiens utilisent un    syst&egrave;me de repr&eacute;sentation des nombres en base 16    (syst&egrave;me hexad&eacute;cimal) : il suffit de regrouper les    digits binaires de droite &agrave; gauche par groupe de 4. Un    groupe vaudra au plus 15 (i.e. 1111 en binaire). Ainsi, on utilise    une base de num&eacute;ration &agrave; 16 chiffres : 0 , 1 , 2 , 3    , ... , 9 , A , B , C , D , E et F. </font>     <P><font size="4">Exemples : Il nous sera ais&eacute; d'&eacute;crire 32767 en    base 16 :</font></P>     <blockquote>      <font size="4"><font color="#AF0000">0 | 0 1111111 | 11111111 </font>(binaire)      </font>        <P><font size="4"><font color="#AF0000">0 | 0 111 | 1111 | 1111 | 1111        </font>(groupes de 4 bits)</font></P>        <P><font size="4" color="#AF0000">0 |&nbsp;&nbsp; 7 &nbsp;&nbsp;&nbsp;&nbsp;F       &nbsp;&nbsp;&nbsp;&nbsp;F &nbsp;&nbsp;&nbsp;&nbsp;F</font></P>        </blockquote>        <P><font size="4">donc 32767 (base 10) s'&eacute;crit 7FFF en base       16.</font></P>     <P><font size="4">Un entier n&eacute;gatif s'obtient alors directement par    compl&eacute;ment &agrave; F (15 en d&eacute;cimal).<BR>    Ainsi : -32768 s'&eacute;crira 8000 en hexad&eacute;cimal (on note    -32768 = &amp;H8000)<BR>    puisqu'il s'&eacute;crit en binaire :</font></P>     <CENTER><font size="4">1 | 000 | 0000 | 0000 | 0000 et que 1000 repr&eacute;sente    8.</font></CENTER>  <P> <IMG SRC="../cgif/tetra.gif" X-CLARIS-USEIMAGEWIDTH X-CLARIS-USEIMAGEHEIGHT ALIGN=middle width="24" height="24"><FONT SIZE="+1" COLOR="#CC0000">Les erreurs d'arrondi :</FONT><FONT SIZE="+1"> on vient de le voir, la repr&eacute;sentation interne d'un nombre est limit&eacute; par le nombre de bits utilis&eacute;s pour le stockage. Par suite, les erreurs de calcul de l'ordinateur peuvent &ecirc;tre plus ou moins importantes suivant les machines. Il faut savoir qu'un r&eacute;sultat affich&eacute; n'est pas celui qui est stock&eacute; dans les entrailles du microprocesseur. </FONT></P>  <P><FONT SIZE="+1">Prenons le cas d'une calculatrice ou d'un micro-ordinateur de poche affichant 10 chiffres significatifs :<BR> </FONT></P>  <CENTER><TABLE BORDER=1 BGCOLOR="#CCFFFF">    <TR>       <TD BGCOLOR="#FFCC99">          <CENTER><B>Tapons :</B></CENTER>       </TD>       <TD BGCOLOR="#FFCC99">          <CENTER><B>On obtient :</B></CENTER>       </TD>    </TR>    <TR>       <TD>          <P>17/13</P>       </TD>       <TD>          <P>1.307692308</P>       </TD>    </TR>    <TR>       <TD>          <P>17/13-1</P>       </TD>       <TD>          <P>0,3076923077</P>       </TD>    </TR>    <TR>       <TD>          <P>(17/13)*10-13</P>       </TD>       <TD>          <P>0,0769230769</P>       </TD>    </TR>    <TR>       <TD>          <P>(17/130)*100-130</P>       </TD>       <TD>          <P>0,769230769</P>       </TD>    </TR> </TABLE> </CENTER>  <P><FONT SIZE="+1">On voit que le dernier chiffre (8) obtenu est un arrondi (800) de 769 : plus clairement 8.10<SUP>-9</SUP> est un arrondi d'affichage d'un calcul interne &eacute;gal &agrave; 7,69.10<SUP>-9</SUP>. Ce qui signifie que, par pr&eacute;caution, ces ordinateurs n'affichent pas deux chiffres risquant d'&ecirc;tre entach&eacute;s d'erreurs : affichage de 10 chiffres significatifs en calculant avec 12.<BR> </FONT></P>  <CENTER><FONT SIZE="+1" FACE="Times" COLOR="#003333"><I>Afin d'&eacute;viter ces probl&egrave;mes, une &eacute;tude math&eacute;matique de ces probl&egrave;mes :<BR>   </I></FONT><FONT COLOR="#CC3300">Etude th&eacute;orique :</FONT><A HREF="arrondis_math.html"><IMG SRC="../cgif/links2.gif" WIDTH=105 HEIGHT=49 BORDER=0 ALIGN=middle></A>   <HR>  <FONT COLOR="#AF0000">&copy; Serge MEHL</FONT></CENTER> </BODY> </HTML> 
