Подтвердить что ты не робот

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

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

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

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

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

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

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

  • Используя char как десятичную цифру, а char * как десятичную string и выполнять вычисления на цифрах с использованием цикла for.
  • Используя int (или long int, или длинный длинный) как базовая "единица" и массив из нее как произвольное длинное целое число, а также вычисления по элементам с использованием цикла for.
  • Использование целочисленного типа для хранения десятичной цифры (или нескольких цифр) в качестве BCD (двоично-десятичная кодировка).
  • алгоритм умножения бухты

Что я не знаю:

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

Что я ценю:

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

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

  • вы думаете, используя double (или длинный двойной, или long long double) может легко решить эту проблему. Если вы так думаете, это означает, что вы не понимаете обсуждаемую проблему.
4b9b3361

Ответ 1

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

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

Ответ 2

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

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

casevh

Ответ 3

Смотрите http://ttmath.org

Небольшая шаблонная библиотека только для заголовков для бесплатного личного и коммерческого использования.

Ответ 4

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

Ответ 5

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

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