4.3.1 les nombres

SQUEAK distingue, comme tout autre langage de programmation, entre différents types de nombres. Pour les nombres entiers SQUEAK distingue entre les petits entiers, des instances de la classe SmallInteger, qui sont des nombres compris dans l’intervalle [-230,230-1]13, et tous les autres entiers, qui sont des instances de la classe LargePositiveInteger ou de la classe LargeNegativeInteger.14 La classe Integer est une classe abstraite regroupant les savoir-faire communs à ces trois classes. La distinction entre les petits entiers et les autres est principalement une différence d’efficacité: les petits entiers disposent d’un ensemble d’opérateurs primitifs15 internes très puissants, accélérant considérablement le calcul. Les grands entiers ne disposent pas de ces primitives. Néanmoins l’utilisateur ne s’aperçoit pas de la différence entre petit et grand entier, puisque SQUEAK se charge de la conversion automatique de l’un vers l’autre. Par la suite, nous allons donc seulement parler des entiers et ne plus faire la distinction selon la les sous-classe de la classe Integer à laquelle ils appartiennent.

Ci-dessous trois exemples d’entiers:

153,16 815915283247897734345611269596115894272000000000,17 4058518
SQUEAK permet de spécifier la base dans laquelle on exprime les nombres. Ceci se fait en précédant le nombre par l’indication de la base, un radix, suivie du caractère “r”, suivie du nombre exprimé dans cette base. Le radix est toujours écrit en décimale (en base 10). Ainsi ces même entiers auraient pu être écrits comme:
2r10011001, 16r8EEAE81B84C7F27E080FDE64FF05254000000000, 10r40585
Le premier nombre ici a été entré en binaire, c’est-à-dire en base 2, le deuxième en hexadécimal, c’est-à-dire en base 16, et le dernier en base décimale, donc en base 10. Si aucune base n’est spécifiée, SQUEAK suppose que le nombre a été exprimé en base 10. Il n’est donc pas nécessaire de spécifier cette base.

SQUEAK permet aussi d’exprimer des nombres avec un exposant. L’exposant exprime par quelle puissance de la base il faut multiplier le nombre pour avoir le nombre en représentation non-exponentielle. La notation pour un exposant est de faire suivre le nombre par la lettre “e” suivie de la valeur de l’exposant. Ainsi 10e2 est la même chose que 10 * 102, donc 1000. Notez que la base de l’exposant est toujours la même que celle spécifiée dans le radix!. Ainsi 2r1010e2 est égal à la valeur décimale 40, puisque 2r1010 vaut 10 en base 10, et 2r1010e2 vaut 10 * 22 (la base est 2, donc la base de l’exposant est 2 aussi) et cela fait bien 10 * 4 = 40.

SQUEAK permet également de travailler avec des nombres en virgule flottante19 en double précision. Ce sont des instances de la classe Float. Ils représentent des approximations de nombres réels et peuvent être compris dans l’intervalle [-10307,10307]20. Comme dans tous les autres langages de programmation, un nombre en virgule flottante est entré en séparant la partie entière de la partie fractionnaire par un point (“.”), comme dans 3.1415926 ou 2.7182. Naturellement, comme pour les nombres entiers, les nombres en virgule flottante peuvent être écrits avec des exposants ou/et dans des bases arbitraires. Ci-dessous un tableau avec à gauche des nombres en virgule flottante et à droite comment SQUEAK les imprime, donc leur représentation en base décimale:



entrée impression


2.09889e43 2.09889e43
2r1.1 1.5
2r1.1e4 24.0
16rAC.DC 172.859375
16r-1.C -1.75
8r7.77777 7.999969482421875
16r-1.Ce2 -448.0


SQUEAK permet d’autres types de valeurs numériques: des Fractions et des Points. Une instance de la classe Point est un couple de nombres représentant des coordonnées dans un plan euclidien qui s’écrit comme x@y. Ainsi 4@5 représente le point de coordonnées x = 4 et y = 5. Mais ce n’est pas un littéral: 4@5 est bien une instance de la classe Point; elle a été créée comme résultat de la transmission du message @ avec l’argument 5 à l’entier 4.21 La représentation 4@5 est juste la manière de SMALLTALK pour imprimer une instance de la classe Point. Nous y reviendrons par la suite. Pour l’instant notons que la classe Point est sous-classe de la classe Object et non de la classe Number et admirons ci-dessous quelques exemples d’utilisation de points:


entrée impression


(1@2) class Point
(1@2) asString ’1@2’
1@2 + (2@3) 3@5
1@2 * (2@3) 2@6
1@2 + 2 3@4
1@2 * 2 2@4
1@2 / 2 (1/2)@1


Les nombres rationnels, les fractions, sont utilisés très souvent en SMALLTALK, d’un part pour éviter des erreurs d’arrondi, d’autre part pour limiter l’usage des nombres à virgule flottante. Comme les points, les fractions ne sont pas des littéraux: elles sont obtenues par l’envoi du message “/ à un entier. Ce message crée un entier si l’entier receveur est un multiple de l’entier donné en argument comme, par exemple, dans la transmission 8 / 2 qui retourne l’entier 4. Il crée une instance de la classe Fraction si le receveur, le numérateur, n’est pas un multiple de l’argument, le dénominateur, comme, par exemple, dans la transmission 8 / 5 qui retourne la fraction (8/5). Tout se passe comme si SMALLTALK retardait l’évaluation de la division jusqu’à l’instant où l’évaluation devient nécessaire. Ci-dessous quelques exemples de d’utilisation de fractions:


entrée impression


1 / 13 + (12 / 13) 1
1/3 + (1/4) (7/12)
1/3 * (1/4) (1/12)
1/3 / (1/4) (4/3)
24 / 10 + (2/5) (14/5)
24 / 10 + 2 / 5 (22/25)
1.0 / 3 + (1/4) 0.583333333333333
(1/3) sin 0.327194696796152