Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 2 sur 2
  1. #1
    Invité de passage
    Inscrit en
    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.

  2. #2
    Membre confirmé Avatar de golden boy
    Homme Profil pro
    Étudiant
    Inscrit en
    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 : 229
    Points
    229

    Par défaut

    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.

    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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •