Conseils de codage en C/Qualité numérique

L'application de ces règles doit permettent d'éviter des erreurs de calcul.

Types homogènes dans les calculs (c_num_1)

modifier

Une expression arithmétique ne doit comporter que des éléments du même type.

Justification

modifier

Évite les erreurs de calcul dues aux règles de conversions implicites des langages. C’est le programmeur qui doit définir explicitement les conversions de type. Les conséquences du mélange d'opérandes de même type :

  • Perte de précision par troncature de la mantisse.
  • Perte de la valeur numérique, par exemple : un grand entier long devient un entier court négatif.

Exemple

modifier
unsigned int u =2;
int n = -2;
n = n / u;

n ne vaut pas -1 à la fin, mais une valeur du genre : 2147483647, ce qui faussera beaucoup les calculs ultérieurs , pour avoir un résultat correct il aurait fallut écrire n = n/(int) u;

Les compilateurs et les outils de contrôle statique comme splint émettent des avertissements.

Ne pas tester l'égalité de deux réels (c_num_2)

modifier

Justification

modifier

Améliore la qualité numérique.

a = a +1 dans une boucle peut produire la valeur a = 9.999999999 au lieu de 10.0, une instruction du genre if (a==10.0) ne fonctionnera pas comme prévue.

Au lieu de if ( A == B )

Écrire if ( fabs( A - B ) < EPS ) EPS est une valeur très petite qui dépend de la précision de la machine, utiliser si disponible des constantes symboliques définies sur le système.

Les compilateurs et les outils de contrôle statique comme splint émettent des avertissements.

Limitez les erreurs numériques (c_num_3)

modifier

Évitez les phénomènes d'annulation, d’absorption et d’arrondi.

  • Annulation: Erreur qui se produit lors de la soustraction de deux valeurs trop proches.
  • Absorption : Erreur qui se produit lorsqu'on additionne deux valeurs d'un ordre de grandeur trop différent. Ce phénomène est sensible lorsqu'on réalise l'opération un grand nombre de fois.
  • Arrondi : pertes de chiffres significatifs dans la partie décimale du nombre.

Justification

modifier

Les logiciels informatiques tentent de manipuler des nombres réels.

L'ensemble mathématique des décimaux, déjà plus restreint, est infini en étendue : il contient les nombres compris entre plus à moins l'infini. L'écart entre deux nombres peut être infiniment petit. Par contre les nombres en machine sont stockés dans un espace mémoire de taille très limité (32, 64, 128 bits...). Les nombres y sont représentés par une mantisse et un exposant codés sur un nombre fini de bits. On pourrait comparer le domaine de représentation des nombres en machine à une tranche de gruyère pleine de trous.

  • Les résultats trop grands ou trop petits sont tronqués ou changent de signe.
  • Une valeur trop petite peut être ignorée lorsqu'elle est additionnée à un grand nombre.
  • La différence entre deux nombres peut être considérée comme nulle alors que ces nombres sont différents.

Il faut parfois réorganiser les expressions numériques et leur ordre de calcul pour éviter ces erreurs.