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