real and integer
Il existe deux catégories de nombres, les entiers (integer) et les réels (real).
Les entiers :
Ce sont des nombres qui ne contiennent pas de partie décimale,
les plages de valeurs reconnues par Autolisp s'étendent de :
+2147483647 à -2147483648 pour les entiers signés à 32 bits
et +32767 à -32768 pour les entiers signés à 16 bits.
En littéral ça donne pour les positifs :
plus deux milliards cent quarante-sept millions quatre cent quatre-vingt-trois mille six cent quarante-sept
et pour les négatifs :
moins deux milliards cent quarante-sept millions quatre cent quatre-vingt-trois mille six cent quarante-huit.
Ces limites sont assez éloignées, vous en conviendrez, à moins de travailler dans l'espace intersidéral.
La fonction ( getint ) est configurée pour n'accueillir que des entiers signés à 16 bits autrement dit, à l'appel de cette fonction, il ne sera pas possible de stocker dans une variable un nombre plus grand que 32767 ni plus petit que -32768.
Pour rappel, les entiers en système binaire codés à 16 bits sont dans cette plage car (2 puissance 16) donne 65536 ce qui explique la plage des nombres qu'on ventile en -32768, 0 et +32767 représente bien le nombre 65536 de la plage utile.
Cette ligne de code va renvoyer une erreur si l'utilisateur entre un nombre hors limites dans les entiers (integer) ou autre chose qu'un nombre entier :
( setq var1 (getint "\nEntrez un nombre ENTIER\n" )) qui va se présenter ainsi : Nécessite un entier entre -32768 et 32767
et qui relance la fonction ( getint ) en attendant un nombre dans la plage attendue.
Si on doit dépasser les limites spécifiées plus haut, il faut passer en nombres réels.
Une opération arithmétique avec deux entiers (integer) donne un résultat sous forme d'entier, mais une opération avec entiers et réels mélangés donne un résultat sous forme de nombre réel.
( + 10 20 30 ) renvoie 60, que des entiers en arguments, renvoie un entier
( + 10 20 30.0 ) renvoie 60.0, un des arguments est un réel, renvoie un réel.
Lorsque la limite des entiers (64 bits) est atteinte lors d'une opération arithmétique, le résultat est faussé :
( + 2147483647 2 ) renvoie -2147483647 ce qui est faux (il est passé dans les nombres négatifs).
( * 1000000000 5 ) renvoie 705032704 ce qui est erroné.
En introduisant un nombre réel dans l'opération, tout rentre dans l'ordre :
( + 2147483647 2.0 ) renvoie 2.14748e+009 en notation scientifique soit 2147483649.0 et c'est correct.
( * 1000000000 5.0 ) renvoie 5.0e+009 en notation scientifique soit 5000000000.0, résultat correct aussi.
Les réels
Ce sont les nombres contenant une partie décimale, ils sont stockés en double précision à virgule flottante, mais la précision s'arrête à la quatorzième décimale,
Nous avons déjà vu ailleurs qu'AutoLISP ne montre pas toujours la totalité des décimales lors de l'interrogation d'une variable, mais il en est bel et bien tenu compte dans les calculs.
Les nombres compris entre -1 et 1 doivent être explicitement rentrés avec le zéro puis le point décimal pour être reconnus sans erreur : ( + 0.2 1.0 ) renvoie 1.2 ce qui est correct, mais ( + .2 1.0 ) renvoie une erreur : placement incorrect d'un point en entrée
7 juillet 2017
mise à jour le 07 mai 2018
mise à jour le 28 mai 2023.