Лучшая кроссплатформенная (переносная) математическая библиотека с произвольной точностью
Я ищу хорошую математическую библиотеку произвольной точности в 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) может легко решить эту проблему. Если вы так думаете, это означает, что вы не понимаете обсуждаемую проблему.
Ответы
Ответ 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/