Лучшая кроссплатформенная (портативная) математическая библиотека произвольной точности [закрыто]


Я ищу хорошую математическую библиотеку произвольной точности в C или c++. Не могли бы вы дать мне несколько советов / предложений?

главные требования:

  1. Это должны обрабатывать сколь угодно большие целые числа (мой основной интерес заключается в целых числах). В случае, если вы не знаете, что означает слово произвольно большой, представьте себе что-то вроде 100000! (факториал 100000).
  2. точность НЕ НУЖНО должен быть указан во время инициализации библиотеки / создания объекта. Точность должна только ограничиваться доступными ресурсами системы.
  3. Это должны используйте полную мощность платформы и должны обрабатывать "маленькие" числа изначально. Это означает, что на 64-разрядной платформе вычисление 2^33 + 2^32 должно использовать доступные 64-разрядные инструкции CPU. Библиотека НЕ ДОЛЖНО вычислить точно так же, как это делает с 2^66 + 2^65 на той же платформа.
  4. Это должны обрабатывать сложение ( + ), вычитание ( - ), умножение ( * ), целочисленное деление ( / ), остаток ( % ), мощность ( * * ), инкремент ( ++ ), декремент ( -- ), gcd (), факториал () и другие общие целочисленные арифметические вычисления эффективно. Возможность обрабатывать такие функции, как sqrt() (квадратный корень), log() (логарифм), которые не дают целочисленных результатов, является плюсом. Способность обрабатывать символьных вычислений еще лучше.

здесь вот что я нашел до сих пор:

  1. Java ' s BigInteger и BigDecimal класс: я использую их до сих пор. Я прочитал исходный код, но я не понимаю математику под ним. Он может быть основан на теории алгоритмов, которые я никогда не узнал.
  2. встроенный целочисленный тип или в основных библиотеках bc/Python / Рубин/Haskell/ Lisp/Эрланг/ OCaml/ PHP / другие языки: я когда-либо использовал некоторые из них, но я понятия не имею, на какие библиотеки они используют, или какой реализации они используют.

то, что я уже знал:

  1. С помощью char как десятичная цифра, и char* как a десятичная строка и выполнять вычисления по цифрам С помощью цикла for.
  2. С помощью int (или long int или долго) как базовая "единица" и массив ее как произвольное длинное целое число, а также выполнять вычисления на элементах с помощью цикла for.
  3. использование целочисленного типа для хранения десятичной цифры (или нескольких цифр) как BCD (двоичный код десятичное).
  4. алгоритм умножения Бута

чего я не знаю:

  1. Печать двоичного массива, упомянутого выше, в десятичном формате без использования наивных методов. Пример наивный метод: (1) добавить биты от самого низкого до самого высокого: 1, 2, 4, 8, 16, 32, ... (2) использовать char* строка, упомянутая выше для хранения промежуточного десятичного числа результаты.)

Что я ценю:

  1. хорошее сравнение на GMP, MPFR, decNumber (или другие библиотеки, которые хороши на ваш взгляд).
  2. хорошие предложения по книгам / статьям, которые я должен прочитать. Например, иллюстрация с рисунками о том, как ООН-наивный алгоритм преобразования двоичного в десятичное работает хорошо. Статья "двоично-десятичное преобразование с ограниченной точностью" Дуглас У. Джонс является примером хорошей статьи.
  3. любая помощь.

пожалуйста НЕ НАДО ответить на этот вопрос, если:

  1. вы думаете, используя двойной (или двойной или длинный длинный двойной) может решить эту проблему легко. Если вы так думаете, то это означает, что вы не понимаете обсуждаемого вопроса.
5 72

5 ответов:

ГМП популярный выбор. У Squeak Smalltalk есть очень хорошая библиотека, но она написана на Smalltalk.

вы просили соответствующие книги или статьи. Хитрая часть работу со сверхбольшими числами деление в столбик. Я рекомендую на бумаге бринч Хансена многократная длина дивизии пересматривается: экскурсия по минному полю.

в целом, он самый быстрый общего назначения произвольной точности библиотека GMP. Если вы хотите работать со значениями с плавающей запятой, посмотрите на MPFR библиотека. МПФР основано на ГМП.

Что касается собственной поддержки произвольной точности на других языках, Python использует свою собственную реализацию из-за лицензии, размера кода и причин переносимости кода. Элемент GMPY модуль позволяет Python получить доступ к библиотеке GMP.

casevh

Я сам не сравнивал арифметические библиотеки произвольной точности друг с другом, но люди, которые, похоже, более или менее равномерно обосновались на GMP. Для чего это стоит, произвольные целые числа точности в GHC Haskell и GNU Guile Scheme реализованы с использованием GMP и самой быстрой реализации pidigits benchmark на языке shootout основано на GMP.

Если вы еще сомневаетесь в актуальности, см. Также http://ttmath.org

а как же Пари? Он построен на вершине GMP и предоставляет все другие лакомства о операциях теории чисел, которые вам когда-либо понадобятся (и многие символические вычисления).

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