002_Variables

Les scalaires

Il ne faut pas confondre l'identificateur d'une variable et la valeur de la variable. La valeur d'une variable est conservée dans une zone mémoire.
Si SOMME vaut 10, la notation algorithmique

SOMME = SOMME + 5

affecte à la zone SOMME la valeur précédente de SOMME + 5 (soit 15) .
Autre exemple :

SOMME = SOMME + SOMME

fait passer la zone valeur SOMME de 10 à 20. Les termes de left value et right value désignent respectivement la zone mémoire et la valeur qu'elle recèle. On considère des objets informatiques et non plus mathématiques. Un objet informatique est caractérisé par le fait qu'il a non seulement une valeur mais une identité (ou une place dans la mémoire si l'on préfère). Ainsi, en mathématique il n'existe qu'un objet 392 alors que dans un système informatique on pourra avoir deux objets différents qui ont cette valeur (deux places dans la mémoire qui contiennent cette valeur). Il s'agira donc de bien faire la distinction entre identité (le même objet) et égalité (la même valeur).
Un ordinateur manipule des représentations de valeurs, qui sont des configurations de bits, d'octets ou de mots de la mémoire. Comme les représentations physiques varient selon les objets, on est conduit à spécifier leurs types.

Les entiers

sont en nombre fini dans l'ordinateur, donc certaines opérations peuvent créer un débordement, i.e. fournir un résultat hors des limites de l'intervalle. Le langage C ne teste jamais le résultat.

Les réels

L'ensemble est discontinu, la norme IEEE 754 décrit les nombres à virgule flottante.
La longueur effective (en octets), et donc les bornes extrêmes, dépendent évidemment de la machine. L'information est souvent disponible.

 

Les caractères

ne sont pas les mêmes selon le pays, l'ensemble des caractères est un sous-ensemble des entiers. Pour un ensemble de variables définit la langue dans laquelle s'affichent les messages et l'ordre du tri alphabétique.

Tableaux

Il est fréquent de manipuler des données de même type formant une collection que l'on nomme tableau. Chaque valeur est désignée par le nom du tableau et d'un ou plusieurs indice(s) ; ce nom peut être manipulé comme celui d'une variable. Un tableau à une seule dimension est souvent appelé vecteur. On peut utiliser des tableaux à dimensions.

Les variables composites

Il est parfois nécessaire de manipuler des ensembles de données formant un tout ; ces ensembles sont nommés agrégats, enregistrements ou structures.

Les pointeurs

Un pointeur est une variable dont la valeur donne l'accès à une autre variable (elle contient en quelque sorte l'adresse de celle-ci)

La norme IEEE 754

La norme IEEE standard for binary floating Point arithmetic (ANSI/IEEE Standard 754 – 1985) a été définie dans  le but d'améliorer la qualité du calcul flottant et la portabilité des applications. Ce standard est maintenant utilisé et respecté par tous les acteurs principaux du calcul scientifique. Deux formats principaux 32 et 64 bits (voir
figure ) et quatre modes d'arrondis (vers \infty, -\infty, vers 0, au plus près)
sont définis, ainsi que des formats dits étendus.
 	\begin{tabular}{|c|c|c|} 	\multicolumn{1}{l}{31} & 	\multicolumn{1}{c}{30 \hfill 23} & 	\multicolumn{1}{c}{22 \hfill 0} \\ 	\hline 	S & E & M \\ 	signe & exposant & mantisse \\ 	\hline 	\multicolumn{1}{c}{1} & \multicolumn{1}{c}{8} & \multicolumn{1}{c}{23} \\ 	\multicolumn{3}{c}{} \\ 	\multicolumn{3}{c}{Format flottant simple pr\'ecision} \\ 	\multicolumn{3}{c}{} \\ 	\multicolumn{1}{l}{63} & 	\multicolumn{1}{c}{62 \hfill 52} & 	\multicolumn{1}{c}{51 \hfill 0} \\ 	\hline 	S & E & M \\ 	signe & exposant & mantisse \\ 	\hline 	\multicolumn{3}{c}{} \\ 	\multicolumn{3}{c}{Format flottant double pr\'ecision} \\ 	\multicolumn{3}{c}{} \\ 	\end{tabular}
Le nombre représenté par le flottant (S,E,M) est (-1)^{s} \times (1 + M) \times 2^{(\mbox{ \text{exposant - biais}})} où : biais = 127 pour les flottants simple précision et biais = 1023 pour les flottants double précision ; la mantisse (M) est codée sur 23 bits pour les flottants simple précision et sur 52 bits pour les flottants double précision.

La quasi-totalité des architectures d'ordinateurs actuelles, y compris IA32, PowerPC, et AMD64, incluent une implémentation matérielle des calculs sur flottants IEEE, directement dans le microprocesseur, garantissant une exécution rapide.

La Norme donne une convention pour représenter des valeurs spéciales : "\pm\infty" , NaN (not a number) qui permettent de donner des valeurs à des divisions par zéro, ou à des racines carrées de nombres négatifs par exemple. Les valeurs spéciales permettent d'écrire des programmes de calculs de racines de fonctions éventuellement discontinues.

La norme IEEE 754 est la suivante :
 	\begin{tabular}{lcl} 	& & \\ 	\hline 	\multicolumn{1}{c}{\hbox to 2cm {\small\hfil Exposant\hfil}}& 	\multicolumn{1}{c}{\hbox to 2 cm{\small\hfil Mantisse\hfil}} & 	\multicolumn{1}{c}{\hbox to 2 cm{\small\hfil Valeur\hfil}}\\ 	\hline 	$e = e_{min} - 1$ & $f = 0$ & $\pm0$ \\ 	$e = e_{min} - 1$ & $f \neq 0 $ & $0,f \times 2^{e_{min}}$\\ 	$e_{min}\leq e \leq e_{max}$ & & $1,f \times 2^{e}$ \\ 	$e = e_{max} + 1$ & $f = 0 $ & $ \pm\infty$ \\ 	$e = e_{max} + 1$ & $f \neq 0$ & {\sc n}a{\sc n} \\ 	\hline 	\end{tabular}

La précision d'un nombre flottant est 2^{-23} \simeq 10^{-7} en simple précision et 2^{-52} \simeq 2 \times 10^{-16}  en double précision. On perd donc 2 à 4 chiffres de précision par rapport aux opérations entières. Il faut comprendre aussi que les nombres flottants sont alignés avant toute addition ou soustraction, ce qui entraîne des pertes de précision. Par exemple, l'addition d'un très petit nombre à un grand nombre va laisser ce dernier inchangé. Il y a alors dépassement de capacité vers le bas (underflow). Un bon exercice est de montrer que la série harmonique converge en informatique flottante, ou que l'addition flottante n'est pas associative ! Il y a aussi des débordements de capacité vers le haut (overflow). Ces derniers sont en général plus souvent testés que les dépassements vers le bas.

Pour être complet, la représentation machine des nombres flottants est légèrement différente en IEEE. En effet, on s'arrange pour que le nombre 0 puisse être représenté par le mot machine dont tous les bits sont à 0, et on additionne la partie exposant du mot machine flottant de e_{min}, c'est-à-dire de 127 en simple précision, ou de 1023 en double précision.