Comment gérer arbitrairement grands entiers
Je suis en train de travailler sur un langage de programmation, et aujourd'hui, je suis au point où je pourrais compiler la fonction factorielle(récursif), mais en raison de la taille maximale d'un entier le plus grand que je puisse avoir est factoriel(12). Quelles sont certaines des techniques pour la manipulation des entiers d'un arbitraire de taille maximale. La langue actuellement des œuvres de traduction de code C++.
Ce que vous cherchez est souvent désigné comme "Bignum", en gros une sorte de classe qui gère arbitrairement grand nombres entiers
Vous ne pouvez pas manipuler des entiers de l'arbitraire d'un maximum de taille, étant donné que la taille maximale est limitée par l'espace de stockage disponible, et aucun ordinateur n'a de stockage infini. Vous pouvez écrire des bibliothèques pour gérer un grand nombre que vous êtes susceptible d'avoir besoin, mais pensé qu'il était intéressant de commenter qu'il y a des limitations techniques de ces approches.
Cela dit, vous pouvez stocker un très grand nombre avec 4 go de RAM (et un TB de disque dur, si vous voulez vraiment), donc c'est vraiment une objection philosophique.
Vous ne pouvez pas manipuler des entiers de l'arbitraire d'un maximum de taille, étant donné que la taille maximale est limitée par l'espace de stockage disponible, et aucun ordinateur n'a de stockage infini. Vous pouvez écrire des bibliothèques pour gérer un grand nombre que vous êtes susceptible d'avoir besoin, mais pensé qu'il était intéressant de commenter qu'il y a des limitations techniques de ces approches.
Cela dit, vous pouvez stocker un très grand nombre avec 4 go de RAM (et un TB de disque dur, si vous voulez vraiment), donc c'est vraiment une objection philosophique.
OriginalL'auteur Alex Gaynor | 2008-11-21
Vous devez vous connecter pour publier un commentaire.
Si vous avez besoin de plus de 32-bits que vous pourriez envisager d'utiliser des entiers 64 bits (long long), ou de l'utilisation ou de l'écriture d'une précision arbitraire bibliothèque de mathématiques, par exemple,GNU MP.
OriginalL'auteur Barry Kelly
Si vous souhaitez annuler votre propre précision arbitraire de la bibliothèque, voir Knuth est Seminumerical Algorithmes, le volume 2 de son magnum opus.
OriginalL'auteur John D. Cook
Si vous êtes dans une langue (à des fins d'apprentissage, je suppose), je pense que je serais probablement écrire un peu BCD bibliothèque. Stocker tout votre BCD chiffres à l'intérieur des tableaux d'octets.
En fait, aujourd'hui, de gigantesques capacités de stockage, vous pouvez simplement utiliser un tableau d'octets, où chaque octet tient juste à un chiffre (0-9). Ensuite, vous écrivez votre propre routine d'ajouter, de soustraire multiplier et de diviser vos tableaux d'octets.
(Fracture est la plus difficile, mais je parie que vous pouvez trouver un certain code là, quelque part.)
Je peux vous donner quelques Java-comme psuedocode mais ne peuvent pas vraiment faire C++ à partir de zéro à ce point:
J'utilise le fait que nous avons beaucoup de chambre supplémentaire dans un octet pour vous aider à gérer plus les débordements de manière générique. Peut travailler pour la soustraction trop, et de l'aide à certains multiplie les.
OriginalL'auteur Bill K
Il n'y a pas de moyen facile de le faire en C++. Vous aurez à utiliser une bibliothèque externe comme GNU Multiprecision, ou d'utiliser une autre langue qui prend en charge de manière arbitrairement grand des entiers tels que Python.
OriginalL'auteur Adam Rosenfield
D'autres affiches ont donné des liens vers des bibliothèques qui va le faire pour vous, mais il semble que vous essayez de construire ce dans votre langue. Ma première pensée est: êtes-vous sûr que vous besoin de faire cela? La plupart des langues serait d'utiliser un add-on de la bibliothèque comme d'autres l'ont suggéré.
En supposant que vous êtes l'écriture d'un compilateur et vous avez besoin de cette fonctionnalité, vous pouvez mettre en œuvre entier des fonctions arithmétiques arbitrairement pour les grandes valeurs de l'assemblée.
Par exemple, un simple (mais non optimale) la mise en œuvre serait de représenter les nombres en Binaire Codé Décimal. L'arithmétique des fonctions pourrait utiliser les mêmes algorithmes que vous utiliseriez si vous faites le calcul avec le crayon et le papier.
Aussi, pensez à utiliser spécialisé pour un type de données pour ces grands nombres entiers. De cette façon "normale" des entiers pouvez utiliser le standard de 32 bits de l'arithmétique.
OriginalL'auteur Clayton
Ma préférée approche serait d'utiliser ma le type int de 32 bits entiers(ou peut-être le changer à l'interne pour être un long, tant qu'il peut continuer à utiliser les mêmes algorithmes), puis, quand elle déborde, une modification de stockage comme un bignum, que ce soit de ma propre création, ou en utilisant une bibliothèque externe. Cependant, je me sens comme si j'avais besoin de vérifier pour le débordement sur chaque opération arithmétique, à peu près 2x généraux sur l'arithmétique de la fpo. Comment pourrais-je résoudre ce problème?
Oui, vous pouvez même refactoriser un bubblesort à un mergesort... Et vous avez certainement besoin d'un bon marketing de l'image par rapport à d'autres à vendre votre rétrécir enveloppés de votre usage général OO langue pour les grands garçons. Quoi? n'est-il pas d'usage général?
Les problèmes que vous décrivez sont la raison pour laquelle j'ai proposé la création d'un nouveau type de données. C++, Java, etc. ne serait pas convertir automatiquement un 16 bits int de 32 bits si une multiplication débordé, alors pourquoi devriez-vous. D'autre part, si c'est un cas documenté d'exigence, vous aurez juste à accepter l'impact sur les performances.
OriginalL'auteur Alex Gaynor
Si je devais mettre en œuvre ma propre langue et souhaitez soutenir longueur arbitraire de chiffres, je vais utiliser une langue cible avec le carry/emprunter concept. Mais depuis il n'y a pas de HLL qui implémente cette sans de graves implications sur les performances (comme des exceptions), je vais certainement aller à la mettre en œuvre dans l'assemblée. Il va probablement prendre une seule instruction (comme JC en x86) pour vérifier débordement et de le manipuler (comme dans l'ADC x86), qui est un compromis acceptable pour un langage de mise en œuvre de précision arbitraire. Ensuite, je vais utiliser quelques fonctions écrites en assemblée au lieu de régulièrement des opérateurs, si vous pouvez utiliser la surcharge pour une plus élégant de sortie, même mieux. Mais je n'attends pas générés C++ pour être facile à entretenir (ou destiné à être maintenu) comme langue cible.
Ou, il suffit d'utiliser une bibliothèque qui a plus de cloches et de sifflets que vous avez besoin et l'utiliser pour toutes vos numéros.
Comme une approche hybride, détecter le dépassement de montage et d'appeler une fonction de la bibliothèque si dépassement au lieu de rouler votre propre mini-bibliothèque.
OriginalL'auteur artificialidiot