Je peux même calculer ( 476170470581645852036305042887575891541065808607552399123930385521914333389668342420684974786564569494856176035326322058077805659331026192708460314150258592864177116725943603718461857357598351152301645904403697613233287231227125684710820209725157101726931323469678542580656697935045997268352998638215525166389437335543602135433229604645318478604952148193555853611059596230656 p>
blockQuote> EXPT 32768 32768 code>) et j'ai eu: p>
3 Réponses :
LISP bascule automatiquement Math pour utiliser un Bignum paquet quand il voit ce genre de chose . Mais il y a une limitation. Faites vos chiffres assez gros et vous pouvez avoir besoin de plus de bits pour le représenter que des atomes dans l'univers connu. Ensuite, votre mémoire système sera probablement épuisée. :) p>
Il existe des raisons pratiques pour limiter la taille des nombres. La représentation des nombres dans certaines autres langages de programmation est étroitement liée à l'architecture matérielle, avec la taille des nombres limitée par le nombre de bits dans les registres du processeur. P>
Heureusement, dans Lisp, vous pouvez généralement réfléchir à un niveau plus abstrait, libérant le programmeur à partir de détails de ce niveau bas. Mais ce Arthmétic arbitraire de précision est généralement plus lent que la limitation de numéros à adapter dans les registres du processeur. p>
PS: Découvrez également la façon dont l'élégance Lisp gère les fractions. Ne pas tourner les fractions en nombre de points flottants permettent des arithmétiques précis. Par exemple: (+ 1/3 2/7) code> =>
13/21 code> p>
Voici une autre perspective. P>
Une des raisons de vouloir des entiers de précision arbitraires est que les implémentations LISP qui ont des entiers efficaces et non incorrectes, mais n'ont pas de calcul de précision arbitraire, sont enriplinées par rapport à certaines autres langues sur la même plate-forme. p>
emacs lisp porte des entiers en un seul mot avec une étiquette de type et, car il n'a pas d'arithmétique de Bignum (ou peut-être maintenant? mais n'a pas eu à un moment donné), des entiers sont / étaient limités à quelque chose comme 28 bits (sur une plate-forme 32 bits). Ceci est criblé par rapport à c. P>
32 bits est articulé, mais 28 est très criblé. Cela rend l'interopérabilité avec d'autres programmes. Par exemple, lisez des structures binaires contenant 32 bits d'entiers. P>
Par exemple, le Newreader GNU Emacs s'est cassé (sur des boîtes 32 bits) lors de la connexion à des serveurs où les numéros d'articles ont débordé de 28 bits. Il vaut donc la peine d'avoir des Bignums juste pour atteindre 32 bits. P>
Ce n'est pas pourquoi les Bignums ont été introduits dans Lisp, bien sûr. Selon le papier l'évolution de Lisp em> Bignums a été ajouté pour la première fois à MacLisP en 1970 ou 1971, car certains utilisateurs faisant des mathématiques symboliques avec MacSyma l'avaient besoin. P>
Mais si vous mettez en place une LISP avec des entiers étiquetés de type, vous ressentirez la douleur et souhaitez implémenter des Bignums simplement pour contourner les bits que vous avez perdus à la balise de type. P>
Vous pouvez résoudre ce problème en ayant fixé des entiers 32 bits qui sont entassés et des boîtes non comprises 31, 30, ... 28 (quelle que soit la taille de votre étiquette). Mais c'est très peu de goûte pour la complexité. Avec ce schéma, vous devez déjà gérer toutes les combinaisons de vos routines mathématiques: non Boxed - Boxed - Boxed - Boxed - Boxed - Unboxed - Unboxed, etc. avec un tas plus d'effort, vous pouvez faire des Bignums. P>
Go Bignum ou rentrez chez vous, sais ce que je veux dire? :) p>
Pensez Bignum, soyez Bignum! p>
Il faut un homme de Bignum pour admettre qu'il est fixnum. p>
Marche (le code, macros en expansion) doucement et porter un gros nombre! p>
Plus ils sont Bignum, plus ils sont plus difficiles. p>
Même .NET 4.0 a un type de biginteger ces jours-ci. Voir Msdn.microsoft.com/en-us/Library/...