86 votes

La meilleure bibliothèque mathématique de précision arbitraire multi-plateforme (portable)

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:

  1. 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).
  2. 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.
  3. 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.
  4. 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:

  1. 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.
  2. 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:

  1. À 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.
  2. À 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.
  3. À l'aide d'un type entier pour stocker un chiffre décimal (ou de quelques chiffres) BCD (Binaire codé décimal).
  4. Stand de l'algorithme de multiplication de

Ce que je ne sais pas:

  1. 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:

  1. De bonnes comparaisons sur les GMP, MPFR, decNumber (ou d'autres bibliothèques qui sont bonnes à votre avis).
  2. 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.
  3. Toute aide.

Veuillez NE PAS répondre à cette question:

  1. 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.
  2. vous n'avez aucune expérience sur la précision arbitraire mathématiques.

Je vous remercie à l'avance!

Asuka Kenji

27voto

Norman Ramsey Points 115730

GMP est le choix populaire. Squeak Smalltalk a une très belle bibliothèque, mais elle est écrite en Smalltalk.

Vous avez demandé des livres ou des articles pertinents. La partie délicate des bignums est une longue division. Je recommande le document de Per Brinch Hansen intitulé Multiple-Length Division Revisited: A Tour of the Minefield .

14voto

casevh Points 4596

Dans l'ensemble, il plus rapide usage général précision arbitraire bibliothèque GMP. Si vous souhaitez travailler avec des valeurs à virgule flottante, regardez la MPFR de la bibliothèque. MPFR est basé sur les BPF.

Concernant le natif de précision arbitraire de soutien dans d'autres langages, Python utilise sa propre mise en œuvre en raison de la licence, la taille du code, et le code des raisons de portabilité. Le GMPY module permet l'accès Python la librairie GMP.

casevh

9voto

Si vous vous interrogez encore sur l’actualité, voir aussi http://ttmath.org

8voto

Richard Barrell Points 1952

Je n'ai pas comparé moi-même les bibliothèques arithmétiques de précision arbitraire, mais les personnes qui semblent avoir plus ou moins uniformément opté pour les BPF. Pour ce que cela vaut, les entiers de précision arbitraire dans GHC Haskell et GNU Guile Scheme sont tous deux implémentés à l'aide de GMP, et l'implémentation la plus rapide de la référence pidigits sur la fusillade de langage est basée sur GMP.

5voto

fortran Points 26495

Qu'en est-il de Pari? Il est construit sur le meilleur des BPF et fournit toutes les autres choses utiles sur les opérations de la théorie des nombres dont vous aurez jamais besoin (et beaucoup de calculs symboliques).

http://pari.math.u-bordeaux.fr/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X