Précédent   Forum du club des développeurs et IT Pro > Autres langages > Langages fonctionnels > Lisp
Lisp Forum d'entraide sur la programmation en langages fonctionnels Lisp et Common Lisp
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 11/10/2011, 22h23   #1
elirgume
Invité de passage
 
Inscription : décembre 2010
Messages : 8
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 8
Points : 1
Points : 1
Par défaut Mise en mémoire des nombres en LISP ?!?

Bonjour à tous,

Débutant en LISP, je commence à me poser quelques questions assez existentielles, à propos de la mémoire dans ce langage.

En testant une fonction 'factorielle' définie récursivement, j'ai pu observer que lisp (je suis sous clisp) permettait de calculer des nombres très très grands. L'interpréteur me renvoie une valeur (qui me parait correcte, plus ou moins) de factorielle(1000).

Ceci est impossible en C, ou en JAVA, avec les types primaires, ceux ci étant représentés (si je me souviens bien) sur un maximum de 4 octets. La fonction factorielle en C ou en JAVA ne donne de bonnes valeurs que pour n <= 20, ensuite -> débordement.

Quel miracle permet à LISP de renvoyer des valeurs aussi énorme ?
Si l'un d'entre vous a la réponse .. !!
Merci d'avance.
elirgume est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/11/2011, 22h23   #2
golden boy
Membre confirmé
 
Avatar de golden boy
 
Homme
Étudiant
Inscription : novembre 2010
Messages : 120
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2010
Messages : 120
Points : 224
Points : 224
Ce lien pourrait peut-être t'éclairer http://x86asm.net/articles/working-w...ons/index.html

ça parle un peu d'assembleur mais c'est pas l'essentiel de l'article. On y décrit surtout la représentation des "grands" nombres en mémoire, ainsi que leur manipulation (addition, soustraction...). On remarque que c'est pas si « miraculeux » finalement

Après, si ton implémentation LISP permet de manipuler des nombres infiniment très grand, et ce arbitrairement, (du moins tant qu'on a de la RAM), c'est peut-être qu'il y a un système d'allocation dynamique (histoire de pas allouer 50 octets juste pour un nombre qui rentre dans 10), mais le principe resterait le même que celui du lien ci-dessus, mais en dynamique.

Citation:
Ceci est impossible en C, ou en JAVA, avec les types primaires, ceux ci étant représentés (si je me souviens bien) sur un maximum de 4 octets. La fonction factorielle en C ou en JAVA ne donne de bonnes valeurs que pour n <= 20, ensuite -> débordement.
Ce n'est pas le cas pour toutes les machines, mais tu remarqueras que 4 octets correspond à 32 bits, soit la taille maximale d'une « entité » avec laquelle de nombreux processeurs actuels effectuent les calculs. Sur 32 bits (en entier non-signé) tu devrais en principe ne pas pouvoir dépasser 12!.
La limite de la valeur d'un entier non-signé, suivant le nombre n de bits sur lequel il est représenté, est donné par : (2^n)-1. Ainsi sur 4 octets soit 32 bits tu ne peux dépasser (2^32)-1. En utilisant, en C, le type 'double', tu peux avoir une valeur correcte jusqu'à un peu plus de 170!, si je me souviens bien. Donc le nombre de bits n'est pas le seul facteur, il y aussi le format de représentation, en l'occurrence c'est le format IEEE Double Precision (pour mon 170!) si je me souviens bien. (cf. http://fr.wikipedia.org/wiki/IEEE_75..._.2864_bits.29 ).

En espérant avoir pu t'aider
golden boy est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 17h50.


 
 
 
 
Partenaires

Hébergement Web