Nombres à virgule flottante

On a parfois besoin de faire des calculs sur des nombres décimaux (ou nombres à virgule flottante), et non seulement entiers. Pour cela, on dispose de trois types à virgule flottante, nommés float, double et long double. Ils se distinguent par la taille qu’ils occupent et la précision qu’ils autorisent.

Une variable de type float occupe quatre octets, peut varier de ±3.4 10-38 à ±3.4 1038, et a une précision d’environ sept chiffres décimaux. Une variable de type double occupe huit octets, peut varier de ±1.7 10-308 à ±1.7 10308, et a une précision d’environ quinze chiffres décimaux. Enfin une variable de type long double occupe dix octets, peut varier de ±3.4 10-4932 à 3.4 104932 et a une précision d’environ dix-neuf chiffres décimaux.

À ces intervalles de valeurs il faut ajouter quatre valeurs spéciales, 0, +infini, -infini et NaN (not a number, pas un nombre). Les trois dernières sont générées en cas de débordement de capacité, ou d’opération interdite (0/0 par exemple). En principe, de telles valeurs ne sont jamais vues car elles provoquent l’arrêt du programme avec un message. Toutefois, ce comportement par défaut peut être modifié par les routines signal et matherr. Par défaut, les dépassements de capacité par le bas ne sont pas interceptés : ils renvoient simplement la valeur 0.

Les entiers sont automatiquement convertis en décimaux lorsqu’une opération fait intervenir ces deux types de variables. Inversement, des affectations comme celle-ci :

float f = 2.6;int i = f;

sont tout à fait autorisées. Elles ont pour conséquence une troncature de la valeur à virgule flottante, par suppression des décimales. En conséquence, i vaudra 2 après l’initialisation ci-dessus. De plus, lorsqu’il y a débordement de capacité des entiers, seuls les bits les moins significatifs sont conservés, comme pour les autres opérations. Donc, si f était initialisé à 65 789.9 par exemple, i serait initialisé à 253 = 65 789 modulo 65 536. Toutefois, si le nombre décimal est plus grand que la plus grande valeur entière possible (232 -1), le programme s’interrompt en indiquant une erreur (overflow, c’est-à-dire débordement).

Précédent Précédent Sommaire Sommaire Suivant Suivant