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 |
|
|
| |