Chers ninjas / les pirates / assistants,
mots-clés: bignum
, bigint
, GMP
, MPFR
, decNumber
, BigInteger
, BigDecimal
, java.math.BigInteger
, java.math.BigDecimal
, System.Numerics.BigInteger
Je suis à la recherche d'une bonne précision arbitraire bibliothèque de mathématiques en C ou C++. Pourriez-vous me donner quelques conseils / suggestions?
Les exigences primaires:
- Il DOIT manipuler arbitrairement grands entiers (mon principal centre d'intérêt est sur des entiers). Dans le cas où vous ne savez pas ce que le mot arbitrairement grands moyens, imaginez quelque chose comme 100000! (la factorielle de 100000).
- La précision ne DOIT PAS BESOIN d'être spécifié lors de l'initialisation de la bibliothèque / création de l'objet. La précision doit SEULEMENT être limité par les ressources disponibles du système.
- Il DEVRAIT profiter de la puissance de la plate-forme, et doit gérer les "petits" nombres en mode natif. Cela signifie que sur une plate-forme 64 bits, calculer 2^33 + 2^32 doit utiliser le 64 bits instructions du PROCESSEUR. La bibliothèque ne DOIT PAS calculer de la même manière comme il le fait avec 2^66 + 2^65 sur la même plate-forme.
- Il DOIT gérer plus (+), de soustraction (-), multiplication (*), integer division (/), le reste (%), alimentation (**), incrémentation (++), de décrémentation (--), pgcd(), factorielle(), et les autres communes de l'arithmétique entière des calculs de manière efficace. Capacité à gérer des fonctions comme sqrt() (racine carrée), log() (logarithme) qui ne produisent pas les résultats en entiers est un plus. Capacité à gérer des calculs symboliques , c'est encore mieux.
Voici ce que j'ai trouvé jusqu'à présent:
- Javas' BigInteger et BigDecimal la classe: j'ai été à l'aide de ces jusqu'ici. J'ai lu le code source, mais je ne comprends pas les maths en dessous. Il peut être basé sur les théories / algorithmes que je n'ai jamais appris.
- Le haut-de type entier ou dans les bibliothèques de base de bc / Python / Ruby / Haskell / Lisp / Erlang / OCaml / PHP / quelques autres langues: je n'ai jamais utilisé certains de ces pays, mais je n'ai aucune idée de la bibliothèque dans laquelle ils sont à l'aide, ou le type de mise en œuvre, ils sont utilisant.
Ce que j'ai déjà connu:
- À l'aide d'un char comme un chiffre décimal, et un char* comme une chaîne décimale et d'effectuer des calculs sur les chiffres à l'aide d'une boucle for.
- À l'aide d'un int (ou un long intou un long long) comme une base de "l'unité" et un tableau de ce que l'arbitraire d'un entier long, et d'effectuer des calculs sur les éléments à l'aide d'une boucle for.
- À l'aide d'un type entier pour stocker un chiffre décimal (ou de quelques chiffres) BCD (Binaire codé décimal).
- Stand de l'algorithme de multiplication de
Ce que je ne sais pas:
- Impression du tableau binaire mentionnés ci-dessus en décimal sans l'aide de naïf méthodes. Exemple d'une méthode naïve: (1) ajouter les bits à partir de la plus faible à la plus élevée: 1, 2, 4, 8, 16, 32, ... (2) utiliser un char* chaîne de caractères mentionnés ci-dessus pour stocker l'intermédiaire décimal résultats).
Ce que j'apprécie:
- De bonnes comparaisons sur les GMP, MPFR, decNumber (ou d'autres bibliothèques qui sont bonnes à votre avis).
- De bonnes suggestions sur les livres / articles que je dois lire. Par exemple, une illustration avec des chiffres sur la façon dont les nations unies naïfs de binaire à décimal algorithme de conversion des travaux est bon. L'article "Binaire à Décimal Conversion en Précision Limitée" par Douglas W. Jones est un exemple d'un bon article.
- Toute aide.
Veuillez NE PAS répondre à cette question:
- vous pensez à l'aide d'un double (ou un long double, ou un long long double) peut résoudre ce problème facilement. Si vous ne pensez donc, cela veut dire que vous ne comprenez pas la question en discussion.
- vous n'avez aucune expérience sur la précision arbitraire mathématiques.
Je vous remercie à l'avance!
Asuka Kenji