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

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

Основные требования:

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

Вот то, что я нашел до сих пор:

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

Что я уже знал:

  1. Используя символ как десятичная цифра и символ* как десятичная строка и делают вычисления на цифрах с помощью для цикла.
  2. Используя интервал (или длинное целое или длинное длинное) как основная "единица" и массив его как произвольное длинное целое, и делают вычисления на элементах с помощью для цикла.
  3. Используя целый тип для хранения десятичной цифры (или несколько цифр) как BCD (Двоично-десятичное число).
  4. Алгоритм умножения стенда

Что я не знаю:

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

Что я ценю:

  1. Хорошие сравнения на GMP, MPFR, decNumber (или другие библиотеки, которые хороши по Вашему мнению).
  2. Хорошие предложения на книгах / статьи, которые я должен прочитать. Например, иллюстрация с рассчитывает, как ненаивный алгоритм преобразования из двоичного кода в десятичный работает, хорошо. Статья "Binary to Decimal Conversion in Limited Precision" Douglas W. Jones является примером хорошей статьи.
  3. Любая справка.

НЕ отвечайте на этот вопрос если:

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

77
задан Siu Ching Pong -Asuka Kenji- 10 September 2015 в 14:16
поделиться

3 ответа

GMP - популярный выбор. В Squeak Smalltalk есть очень хорошая библиотека, но она написана на Smalltalk.

Вы просили подходящие книги или статьи. Сложная часть bignum - деление в столбик. Я рекомендую статью Пера Бринча Хансена Многократное деление снова: обзор минного поля .

24
ответ дан 24 November 2019 в 11:02
поделиться

В целом, самая быстрая библиотека произвольной точности общего назначения - это GMP . Если вы хотите работать со значениями с плавающей запятой, посмотрите библиотеку MPFR . MPFR основан на GMP.

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

casevh

13
ответ дан 24 November 2019 в 11:02
поделиться

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

7
ответ дан 24 November 2019 в 11:02
поделиться