<HTML> <HEAD>    <TITLE>Arrondis sur ordinateur (aspect math&eacute;matique)</TITLE>    <X-CLARIS-WINDOW TOP=45 BOTTOM=707 LEFT=28 RIGHT=755>    <X-CLARIS-TAGVIEW MODE=minimal> </HEAD> <BODY BGCOLOR="#FFFFFF"> <CENTER><FONT SIZE="+4" COLOR="#336666"><B>Ordinateur et arrondis<BR> </B></FONT><FONT SIZE="+3" COLOR="#336666"><B>(aspect th&eacute;orique)<BR> </B></FONT></CENTER>  <P><FONT SIZE="+1">On aborde ici l'aspect math&eacute;matique des </FONT><A HREF="arrondis_ordi.html"><FONT SIZE="+1">erreurs d'arrondi</FONT></A><FONT SIZE="+1"> engendr&eacute;es par les ordinateurs (ou les calculatrices).</FONT></P>  <P><FONT SIZE="+1">Soit x un nombre entr&eacute; ou calcul&eacute;. Suivant sa valeur, l'ordinateur va l'arrondir par exc&egrave;s ou par d&eacute;faut. La valeur machine de x sera alors :</FONT></P>  <CENTER><FONT SIZE="+1">x' = x &#177; e avec 0 <IMG SRC="../cgif/infegal.gif" X-CLARIS-USEIMAGEWIDTH X-CLARIS-USEIMAGEHEIGHT width="7" height="7" > e &lt;&lt; 1 </FONT>(&lt;&lt;1 signifiant ici "tr&egrave;s petit" devant 1)<FONT SIZE="+1">. </FONT></CENTER>  <P><FONT SIZE="+1">Plus pr&eacute;cis&eacute;ment :</FONT></P>  <CENTER><FONT SIZE="+1">x' = x(1 + e<SUB>x</SUB>) avec 0 <IMG SRC="../cgif/infegal.gif" X-CLARIS-USEIMAGEWIDTH X-CLARIS-USEIMAGEHEIGHT width="7" height="7" > | e<SUB>x</SUB> | &lt;&lt;1. </FONT></CENTER>  <P><FONT SIZE="+1">Il suit que les erreurs absolues et relatives commises sur x sont respectivement :</FONT></P>  <CENTER><FONT SIZE="+1" FACE="Symbol">D</FONT><FONT SIZE="+1">x = x - x' = xe<SUB>x</SUB> </FONT>&nbsp;<FONT SIZE="+1">et</FONT>&nbsp;&nbsp;<FONT SIZE="+1" FACE="Symbol">D</FONT><FONT SIZE="+1">x / x = e<SUB>x</SUB></FONT></CENTER>  <P><IMG SRC="../cgif/main.gif" X-CLARIS-USEIMAGEWIDTH X-CLARIS-USEIMAGEHEIGHT width="32" height="16" ><FONT SIZE="+1">&nbsp;Nous allons &eacute;tudier trois cas d&eacute;montrant la difficult&eacute; d'appr&eacute;cier les erreurs d'arrondi. </FONT></P>  <P><FONT SIZE="+1">Soit f(x,y) le r&eacute;sultat d'une op&eacute;ration &eacute;l&eacute;mentaire, par exemple f(x,y) = xy (produit).</FONT> <FONT SIZE="+1">Nous avons en diff&eacute;rentiant, f'<SUB>x</SUB>(x,y) et f'<SUB>y</SUB>(x,y) d&eacute;signant les d&eacute;riv&eacute;es partielles de f par rapport &agrave; x et y, avec z = f(x,y) :</FONT></P>  <CENTER><FONT SIZE="+1">dz = f'x(x,y).dx + f'y(x,y).dy</FONT></CENTER>  <P><FONT SIZE="+1">soit, sensiblement, en passant aux valeurs absolues :</FONT></P>  <CENTER><FONT SIZE="+1" FACE="Symbol">D</FONT><FONT SIZE="+1">z <IMG SRC="../cgif/infegal.gif" width="7" height="7" > | f'x(x,y) | . |</FONT><FONT SIZE="+1" FACE="Symbol">D</FONT><FONT SIZE="+1">x| + | f'y(x,y) | . |</FONT><FONT SIZE="+1" FACE="Symbol">D</FONT><FONT SIZE="+1">y|</FONT></CENTER>  <P><FONT SIZE="+1">A chaque mise en m&eacute;moire d'une donn&eacute;e ou d'un r&eacute;sultat interm&eacute;diaire z, l'ordinateur va commettre une </FONT><FONT SIZE="+1" COLOR="#CC3300">erreur e<SUB>s</SUB></FONT><FONT SIZE="+1"> </FONT><FONT SIZE="+1" COLOR="#CC3300">r&eacute;dhibitoire</FONT><FONT SIZE="+1"> d&eacute;pendant de sa capacit&eacute; de stockage. L'erreur absolue commise sur z v&eacute;rifiera alors :</FONT></P>  <CENTER><FONT SIZE="+1" FACE="Symbol">D</FONT><FONT SIZE="+1">z <IMG SRC="../cgif/infegal.gif" X-CLARIS-USEIMAGEWIDTH X-CLARIS-USEIMAGEHEIGHT width="7" height="7" > | f'x(x,y) | . |</FONT><FONT SIZE="+1" FACE="Symbol">D</FONT><FONT SIZE="+1">x| + | f'y(x,y) | . |</FONT><FONT SIZE="+1" FACE="Symbol">D</FONT><FONT SIZE="+1">y| + |ze<SUB>s</SUB>|</FONT></CENTER>  <P><FONT SIZE="+1">et l'erreur relative sera :</FONT></P>  <CENTER><FONT SIZE="+1"> <IMG SRC="an1gif/ArrondisMath1.gif" X-CLARIS-USEIMAGEWIDTH X-CLARIS-USEIMAGEHEIGHT width="377" height="47" ></FONT></CENTER>  <P><FONT SIZE="+1"><BR> </FONT> <IMG SRC="../cgif/tetra.gif" X-CLARIS-USEIMAGEWIDTH X-CLARIS-USEIMAGEHEIGHT ALIGN=middle width="24" height="24"><FONT SIZE="+1"> Application au produit xy : on a ici f'<SUB>x</SUB>(x,y) = y et f'<SUB>y</SUB>(x,y) = x. On obtient alors :</FONT></P>  <CENTER><FONT SIZE="+1">| e<SUB>z</SUB> | <IMG SRC="../cgif/infegal.gif" X-CLARIS-USEIMAGEWIDTH X-CLARIS-USEIMAGEHEIGHT width="7" height="7" > |e<SUB>x</SUB>| + |e<SUB>y</SUB>| + |e<SUB>s</SUB>|.</FONT></CENTER>  <P><FONT SIZE="+1">On voit l&agrave; que l'erreur est la somme des erreurs relatives, ce qui est parfaitement naturel et acceptable. Notons que si x et y sont des donn&eacute;es enti&egrave;res ne d&eacute;passant pas la capacit&eacute; de traitement de la machine, on a e<SUB>x</SUB> = e<SUB>y</SUB> = 0 et la seule erreur possible est l'erreur e<SUB>s</SUB> de stockage du produit. Cette erreur peut se produire si x et y sont grands : perte de chiffres significatifs par arrondi. </FONT></P>  <P><FONT SIZE="+1">Par exemple :</FONT></P>  <CENTER><FONT SIZE="+1"><span style="background-color: #FFFF00">100009 * 100009 = 10001800081</span></FONT></CENTER>  <P><FONT SIZE="+1">or le calcul avec certains micro-ordinateurs de poche fournit 1000180008E+10, soit 10001800080 : l'erreur absolue sur ce produit semble &ecirc;tre 1 et l'erreur relative de 10<SUP>-10</SUP>. </FONT></P>  <P><FONT SIZE="+1">En fait, pour le calcul de 100009 * 100009 - 10000200001, la machine r&eacute;pond 0 : il faut toujours </FONT><FONT SIZE="+1" COLOR="#990000">distinguer l'affichage et le r&eacute;sultat effectivement en m&eacute;moire</FONT><FONT SIZE="+1">. Sur ces machines, les ennuis commencent v&eacute;ritablement d&egrave;s que le r&eacute;sultat poss&egrave;de plus de 12 chiffres significatifs.<BR> <BR> </FONT> <IMG SRC="../cgif/tetra.gif" X-CLARIS-USEIMAGEWIDTH X-CLARIS-USEIMAGEHEIGHT ALIGN=middle width="24" height="24"><FONT SIZE="+1">&nbsp;<A NAME=somme></A>Application &agrave; la somme x + y : on a ici f'<SUB>x</SUB>(x,y) = f'<SUB>y</SUB>(x,y) = 1. On obtient :</FONT></P>  <CENTER><FONT SIZE="+1"> <IMG SRC="an1gif/ArrondisMath2.gif" X-CLARIS-USEIMAGEWIDTH X-CLARIS-USEIMAGEHEIGHT ALIGN=middle width="195" height="47"></FONT></CENTER>  <P><FONT SIZE="+1"><BR> L'erreur d&eacute;pend l&agrave;, non seulement des valeurs de x et y, mais aussi du r&eacute;sultat th&eacute;orique de l'op&eacute;ration. Si x + y est petit, deux nombres </FONT><FONT SIZE="+1" COLOR="#CC3300"><I>quasiment oppos&eacute;s</I></FONT><FONT SIZE="+1"> par exemple, l'erreur peut &ecirc;tre consid&eacute;rable. On voit donc </FONT><FONT SIZE="+1" COLOR="#CC0000">avec quelle m&eacute;fiance il faut regarder un r&eacute;sultat affich&eacute; par l'ordinateur</FONT><FONT SIZE="+1">. </FONT></P>  <P><FONT SIZE="+1"> <IMG SRC="../cgif/main.gif" X-CLARIS-USEIMAGEWIDTH X-CLARIS-USEIMAGEHEIGHT width="32" height="16" >&nbsp;Donnons l'exemple d'une "b&ecirc;te" r&eacute;solution de l'&eacute;quation du second degr&eacute; :</FONT> <FONT SIZE="+1">x<SUP>2</SUP> - 10x - 1/4 = 0. Les solutions sont :</FONT></P>  <CENTER><FONT SIZE="+1">x<SUB>1</SUB> = (10 - <IMG SRC="../cgif/racine.gif" X-CLARIS-USEIMAGEWIDTH X-CLARIS-USEIMAGEHEIGHT width="9" height="11" >101)/2 et x<SUB>2</SUB> = (10 + <IMG SRC="../cgif/racine.gif" X-CLARIS-USEIMAGEWIDTH X-CLARIS-USEIMAGEHEIGHT width="9" height="11" >101)/2</FONT></CENTER>  <P><FONT SIZE="+1">et consid&eacute;rons le petit programme </FONT><A HREF="../java_elem/lang_java.html"><FONT SIZE="+1" COLOR="#0000FF">JavaScript</FONT></A><FONT SIZE="+1" COLOR="#0000FF"> </FONT><FONT SIZE="+1">suivant :</FONT><SCRIPT LANGUAGE=JavaScript>function go() { wdow=open("","calculs","height=140,width=300","scrollbars=yes") wdow.document.write("<PRE>") x1=(10-Math.sqrt(101))/2;x2=(10+Math.sqrt(101))/2; wdow.document.writeln(x1+" , "+x2) p=x1*x2;wdow.document.writeln(p) p1=x1*x1-10*x1-0.25; p2=x2*x2-10*x2-0.25; wdow.document.writeln(p1); wdow.document.writeln(p2); wdow.document.writeln("------------------------")x1=-0.25/x2; wdow.document.writeln(x1+" , "+x2) p=x1*x2;wdow.document.writeln(p) p1=x1*x1-10*x1-0.25; p2=x2*x2-10*x2-0.25; wdow.document.writeln(p1); wdow.document.writeln(p2); }</SCRIPT></P>  <P><TABLE BORDER=0>    <TR>       <TD VALIGN=top BGCOLOR="#FFFFCC">          <P><FONT SIZE="+1" COLOR="#0000FF">&lt;SCRIPT          LANGUAGE=JavaScript&gt;</FONT><FONT SIZE="+1"><BR>          function go()<BR>          {<BR>          wdow=open("","calculs","height=140,width=300","scrollbars=yes")<BR>          wdow.document.write("&lt;PRE&gt;")<BR>          x1=(10-Math.sqrt(101))/2;<BR>          x2=(10+Math.sqrt(101))/2;<BR>          wdow.document.writeln(x1+" , "+x2)<BR>          p=x1*x2;<BR>          wdow.document.writeln(p)<BR>          p1=x1*x1-10*x1-0.25;<BR>          p2=x2*x2-10*x2-0.25;<BR>          wdow.document.writeln(p1);<BR>          wdow.document.writeln(p2);<BR>          wdow.document.writeln("------------------------")<BR>          x1=0.25/x2;<BR>          wdow.document.writeln(x1+" , "+x2)<BR>          p=x1*x2;wdow.document.writeln(p)<BR>          p1=x1*x1-10*x1-0.25;<BR>          p2=x2*x2-10*x2-0.25;<BR>          wdow.document.writeln(p1);<BR>          wdow.document.writeln(p2);<BR>          }</FONT><FONT SIZE="+1" COLOR="#0000FF">&lt;/SCRIPT&gt;</FONT></P>       </TD>       <TD VALIGN=top>          <CENTER><FONT SIZE="+1">          <IMG SRC="../cgif/oeil.gif" X-CLARIS-USEIMAGEWIDTH X-CLARIS-USEIMAGEHEIGHT width="25" height="12" ></FONT>&nbsp;<A HREF="../java_elem/ctes_math.html">fonctions          math&eacute;matiques usuelles de JavaScript</A></CENTER>           <P><FORM ACTION="" METHOD=POST>             <CENTER>              <HR>              <INPUT TYPE=button NAME=Bouton VALUE="Lancer le programme" onclick="go()">              <HR>              </CENTER>          </FORM><FONT SIZE="+1">Ce programme calcule les solutions x1          et x2 de l'&eacute;quation donn&eacute;e au moyen des          formules usuelles rappel&eacute;es ci-dessus. On les affiche          &agrave; l'&eacute;cran. On calcule le produit des racines          (en principe -0,25) et on v&eacute;rifie si les solutions          calcul&eacute;es par l'ordinateur annulent effectivement le          trin&ocirc;me. </FONT></P>           <CENTER><FONT SIZE="+1">          <IMG SRC="an1gif/Arrondis2.gif" X-CLARIS-USEIMAGEWIDTH X-CLARIS-USEIMAGEHEIGHT ALIGN=middle width="222" height="104"></FONT></CENTER>           <P><FONT SIZE="+1">La seconde m&eacute;thode &eacute;vite          l'addition de nombres "presque oppos&eacute;s" par la          formule bien connue x'.x" = c/a et on affiche les          m&ecirc;mes tests que dans la premi&egrave;re          m&eacute;thode.</FONT></P>       </TD>    </TR> </TABLE>  <FONT SIZE="+1">La seconde m&eacute;thode (s&eacute;par&eacute;e par les pointill&eacute;s) s'av&egrave;re clairement plus efficace : nos deux valeurs x1 et x2 annulent effectivement le trin&ocirc;me.<BR> <BR> </FONT> <IMG SRC="../cgif/tetra.gif" X-CLARIS-USEIMAGEWIDTH X-CLARIS-USEIMAGEHEIGHT ALIGN=middle width="24" height="24"><FONT SIZE="+1"> Cas de la racine<IMG SRC="../chrono1/chrono1_gif/racinexy.gif" X-CLARIS-USEIMAGEWIDTH X-CLARIS-USEIMAGEHEIGHT width="33" height="19" > d'un produit , avec x et y positifs : on a ici f'<SUB>x</SUB>(x,y) = y/2<IMG SRC="../cgif/racine.gif" X-CLARIS-USEIMAGEWIDTH X-CLARIS-USEIMAGEHEIGHT width="9" height="11" >(xy) et f'<SUB>y</SUB>(x,y) = x/2<IMG SRC="../cgif/racine.gif" X-CLARIS-USEIMAGEWIDTH X-CLARIS-USEIMAGEHEIGHT width="9" height="11" >(xy)</FONT>  <CENTER> <IMG SRC="an1gif/ArrondisMath3.gif" X-CLARIS-USEIMAGEWIDTH X-CLARIS-USEIMAGEHEIGHT width="150" height="40" ></CENTER>  <P><FONT SIZE="+1" FACE="Times">Dans un probl&egrave;me d'arithm&eacute;tique, si x et y sont donn&eacute;s entiers, et ne d&eacute;passant pas la capacit&eacute; de l'ordinateur, leur produit peut provoquer un d&eacute;passement de capacit&eacute;. Supposons cependant ici x &lt; 100 et y &lt; 100 : les erreurs commises sur x, y et xy sont alors nulles. S'il s'agit de v&eacute;rifier que xy est un carr&eacute; parfait, en admettant que l'algorithme de recherche de la racine carr&eacute;e de la machine soit efficace (i.e. dont la pr&eacute;cision est sup&eacute;rieure &agrave; la capacit&eacute; de stockage), alors on peut &ecirc;tre assur&eacute; que xy est un carr&eacute; parfait si l'on a (en </FONT><A HREF="../java_elem/lang_java.html"><FONT SIZE="+1" FACE="Times">JavaScript</FONT></A><FONT SIZE="+1" FACE="Times">) :</FONT></P>  <CENTER><FONT SIZE="+1">sqrt(x*y) = floor(sqrt(x*y))</FONT></CENTER>  <P><FONT SIZE="+1">En effet, si xy est entier, sa racine carr&eacute;e sera calcul&eacute;e comme &eacute;tant de la forme :</FONT></P>  <CENTER><FONT SIZE="+2"><span style="background-color: #FFFF00">(n) </span> </FONT><FONT SIZE="+1"> <span style="background-color: #FFFF00">, 0000... | 000&#133; ou bien &nbsp;(</span></FONT><FONT SIZE="+2"><span style="background-color: #FFFF00">n - 1)</span></FONT><FONT SIZE="+1"><span style="background-color: #FFFF00">,9999... | 999&#133; </span> </FONT></CENTER>  <P><FONT SIZE="+1">(la barre symbolisant la limite de la capacit&eacute; de stockage) de sorte que la valeur machine sera dans tous les cas l'entier n.</FONT></P>  <CENTER><FONT SIZE="+1"> <IMG SRC="../cgif/oeil.gif" X-CLARIS-USEIMAGEWIDTH X-CLARIS-USEIMAGEHEIGHT width="25" height="12" ></FONT>&nbsp;<A HREF="../java_elem/ctes_math.html">fonctions math&eacute;matiques usuelles de JavaScript</A>  <P><FONT SIZE="+1">  <HR>   </FONT><FONT FACE="Times" COLOR="#FF3300">Voyage au bout de l'horreur...</FONT><A HREF="../anx2/acc_arr.html"><FONT FACE="Times"><IMG SRC="../cgif/links2.gif" WIDTH=105 HEIGHT=49 X-CLARIS-USEIMAGEWIDTH X-CLARIS-USEIMAGEHEIGHT BORDER=0 ALIGN=middle></FONT></A><FONT FACE="Times" COLOR="#FF3300">...   ou les arrondis fatals...</FONT><FONT SIZE="-1" COLOR="#FF3300">   <HR>  </FONT><FONT COLOR="#AF0000">&copy; Serge MEHL</FONT></P></CENTER> </BODY> </HTML> 
