Différences entre les versions de « Programmation C/Types de base »

Aller à la navigation Aller à la recherche
Un des codes C d'exemple était inutile au possible (boucle qui répétait 1000fois EXACTEMENT la même chose : for(...) i = j * 0.1; ). De plus, il était conseillé comme exemple mais ... amenait tout de même à une erreur de précision...
m (→‎Chaîne littérale : orthographe)
(Un des codes C d'exemple était inutile au possible (boucle qui répétait 1000fois EXACTEMENT la même chose : for(...) i = j * 0.1; ). De plus, il était conseillé comme exemple mais ... amenait tout de même à une erreur de précision...)
Le résultat est 99,999046, ce qui montre que la précision du type <code>float</code> est en général mauvaise, d'autant plus que le nombre 0,1 n'est pas représentable de manière exacte en binaire<ref>0,1<sub>10</sub> = 0.0001100110011...<sub>2</sub></ref>. Il est ainsi conseillé d'utiliser le type <code>double</code> à la place de <code>float</code> autant que possible. Dans ce cas de figure, il est préférable d'éviter les accumulations d'erreurs infinitésimales, en réécrivant le code de la manière suivante :
 
<source lang="c" line="1">
#include <stdio.h>
 
{
float i;
int j = 1000;
 
for (j = 0; j < 1000; j++)
{i = j * 0.1;
}
i = j * 0.1;
}
printf("i = %f\n", i);
return 0;
</source>
 
Le résultat est alors 100.0, sans aucune erreur d'accumulation et d'arrondis.
C'est probablement plus coûteux, car on effectue un millier de multiplications au lieu d'un millier d'additions, mais cela permet d'avoir une précision nettement meilleure que le code précédent.
 
Pour plus d'informations sur ce domaine, un wikilivre [[Mathématiques/Arithmétique flottante|Arithmétique flottante]] est disponible.

Menu de navigation