• Aucun résultat trouvé

Types entiers non signés (types modulo)

6.2 TYPES NUMÉRIQUES 1 Motivation

6.2.3 Types entiers non signés (types modulo)

Il est parfois pratique de travailler avec des entiers non signés, c’est-à-dire dont l’intervalle de définition va de zéro à une borne supérieure positive. C’est le cas lorsque l’on veut, par exemple, effectuer des calculs «modulo N». Ada permet la déclaration de types entiers non signés ou types modulo de la manière suivante:

TYPES NUMÉRIQUES 136

• le_modulo est une expression entière positive statique (sect. 3.10), souvent une puissance de 2; par définition, l’intervalle des valeurs du type est toujours 0 .. le_modulo – 1 (exemple 6.8).

Exemple 6.8 Déclaration de types entiers non signés.

type T_Octet is mod 256;valeurs de 0 à 255; type T_Mot is mod 65536;valeurs de 0 à 65535; type T_Indice is mod 1000;valeurs de 0 à 999.

Ces types sont dits non signés car la suite de bits implémentant toute valeur d’un tel type n’aura aucun bit interprété comme bit de signe.

Les opérations applicables à de tels types sont les mêmes que pour le type prédéfini Integer (§ 2.2.2) avec la particularité que le second opérande de l’opérateur arithmétique ** doit toujours être du sous-type Natural.

La principale caractéristique de ces types est qu’il ne peut jamais se produire de débordement de capacité car toute l’arithmétique est effectuée modulo Le_Modulo. De plus, comme c’est le cas pour l’arithmétique d’un processeur, les opérateurs and, or, xor et not sont applicables à des opérandes d’un type modulo,

considérés alors comme des suites de bits.

L’affectation, le passage en paramètre et l’utilisation d’attributs s’effectuent également comme pour Integer. Pour réaliser des entrées-sorties, il faut avoir déclaré

package ES_Entiers_Non_Signes is new

Ada.Text_IO.Modular_IO ( Id_Type_Entier_Non_Signe );

• ES_Entiers_Non_Signes est le nom du paquetage d’entrées-sorties créé, nom choisi par le programmeur;

• Id_Type_Entier_Non_Signe est l’identificateur du type entier non signé.

De manière analogue aux types énumératifs (§ 5.2.5), il est alors possible d’utiliser Get et Put pour lire et pour écrire des valeurs d’un type comme Id_Type_Entier_Non_Signe. Le préfixe ES_Entiers_Non_Signes doit être mentionné, sauf si cette ligne de déclaration est suivie d’une clause use

ES_Entiers_Non_Signes. 6.2.4 Types réels point-flottant

TYPES NUMÉRIQUES 137

Mais comme mentionné auparavant (§ 2.3.5) d’autres types tels que Short_Float ou Long_Float peuvent également être disponibles. Encore une fois tous sont dépendants de la machine utilisée. Pour renforcer la portabilité d’une application mais aussi pour assurer la précision souhaitée dans les applications numériques (calcul scientifique), Ada permet la déclaration de types réels point-flottant (exemple 6.9) de la manière suivante:

type identificateur is digits nb_chiffres;

• nb_chiffres (statique) représente la précision désirée.

Notons tout de suite qu’il est encore possible de contraindre un tel type en définissant un intervalle statique (§ 6.1.1).

Exemple 6.9 Déclaration de types point-flottant. type T_Reel_9 is digits 9; type T_Reel_12 is digits 12;

type T_Unite_6 is digits 6 range 0.0 .. 0.999999;

Les opérations possibles applicables à de tels types sont les mêmes que pour le type prédéfini Float (§ 2.3.2). L’affectation, le passage en paramètre et l’utili- sation d’attributs s’effectuent également comme pour Float.

Pour réaliser des entrées-sorties, il faut avoir déclaré package ES_Reels_Point_Flottant is new

Ada.Text_IO.Float_IO ( Id_Type_Reel_Point_Flottant );

• ES_Reels_Point_Flottant est le nom du paquetage d’entrées-sorties créé, nom choisi par le programmeur;

• Id_Type_Reel_Point_Flottant est l’identificateur du type réel point- flottant.

De manière analogue aux types énumératifs (§ 5.2.5), il est alors possible d’utiliser Get et Put pour lire et pour écrire des valeurs d’un type comme Id_Type_Reel_Point_Flottant. Le préfixe ES_Reels_Point_Flottant doit être mentionné, sauf si cette ligne de déclaration est suivie d’une clause use

ES_Reels_Point_Flottant.

La réalisation d’applications numériques demanderait un approfondissement de l’utilisation des types réels point-flottant, ce qui dépasse l’objectif de ce texte. 6.2.5 Types réels point-fixe

TYPES NUMÉRIQUES 138

Un type réel point-fixe est utile s’il est nécessaire de travailler avec des nombres réels pour lesquels la différence entre deux nombres consécutifs est constante (er-reur absolue) comme lors du calcul de durées temporelles ou dans les applications comptables. Un tel type se déclare de la manière suivante (exemple 6.10):

type identificateur is delta erreur range borne_inf .. borne_sup;

• erreur (statique) représente l’erreur tolérée;

• borne_inf et borne_sup sont des expressions réelles statiques. Exemple 6.10 Déclaration de types point-fixe.

type T_Reel_01 is delta 0.1 range –1.0 .. 1.0;

type T_Secondes is delta 0.001 range 0.0 .. 86_400.0;

Les opérations possibles applicables à de tels types sont les mêmes que pour le type prédéfini Float (§ 2.3.2) avec quelques particularités non détaillées ici. De manière un peu surprenante, il n’existe qu’un seul type point-fixe prédéfini nommé Duration (semblable au type T_Secondes), utilisé lorsqu’il est nécessaire de tenir compte du temps (applications temps réel). Les entrées-sorties sont possibles grâce au paquetage Ada.Text_IO.Fixed_IO utilisé de manière semblable à celle présentée pour les types point-flottant. Mentionnons encore qu’il existe des types réels point-fixe décimaux non traités dans ce texte.