Я ищу хорошую математическую библиотеку произвольной точности на C или C ++. Не могли бы вы дать мне несколько советов или предложений?
Основные требования:
Он должен обрабатывать сколь угодно большие целые числа - меня больше всего интересуют целые числа. В случае, если вы не знаете, что означает слово «произвольно большой», представьте себе что-то вроде 100000! (факториал 100000).
Точность не требуется указывать во время инициализации библиотеки или создания объекта. Точность должна только быть ограничена имеющимися ресурсами системы.
Он должен использовать всю мощь платформы и изначально обрабатывать «небольшие» числа. Это означает, что на 64-битной платформе при вычислении (2 ^ 33 + 2 ^ 32) должны использоваться доступные 64-битные инструкции ЦП. Библиотека не должна рассчитывать это так же, как с (2 ^ 66 + 2 ^ 65) на той же платформе.
Он должен эффективно обрабатывать сложение (
+
), вычитание (-
), умножение (*
), целочисленное деление (/
), остаток (%
), мощность (**
), приращение (++
), декремент (--
), НОД, факториал и другие общие целочисленные арифметические вычисления. Возможность обрабатывать такие функции, как квадратный корень и логарифм, которые не дают целочисленных результатов, является плюсом. Способность обрабатывать символьные вычисления еще лучше.
Вот что я нашел на данный момент:
Java «s BigInteger и BigDecimal класс: Я использую это до сих пор. Я прочитал исходный код, но не понимаю математики под ним. Возможно, это основано на теориях и алгоритмах, которым я никогда не учился.
Встроенный целочисленный тип или основные библиотеки bc , Python , Ruby , Haskell , Lisp , Erlang , OCaml , PHP , некоторых других языков: я использовал некоторые из них, но не знаю, какую библиотеку они используют, или какую реализацию они используют.
Что я уже знал:
Используется
char
для десятичных цифр иchar*
для десятичных строк, а вычисления цифрfor
выполняются с помощью -loop.Использование
int
(илиlong int
, илиlong long
) в качестве базовой «единицы» и массива этого типа в качестве произвольного длинного целого числа и выполнение вычислений с элементами с использованиемfor
-loop.Использование целочисленного типа для хранения десятичной цифры (или нескольких цифр) как BCD (десятичное число с двоичным кодом) .
Чего я не знаю:
- Печать упомянутого выше двоичного массива в десятичном виде без использования наивных методов. Пример наивного метода: (1) сложить биты от младшего к старшему: 1, 2, 4, 8, 16, 32,… (2) использовать
char*
-строку, упомянутую выше, для хранения промежуточных десятичных результатов).
Что я ценю:
Хорошие сравнения GMP , MPFR , decNumber (или других, на ваш взгляд, хороших библиотек).
Хорошие предложения по книгам и статьям, которые я должен прочитать. Например, иллюстрация с фигурами в то, как не-наивные преобразованиях алгоритма работа двоичных к-десятичном будет хорошо. Статья Дугласа У. Джонса « Преобразование двоичного числа в десятичное с ограниченной точностью » является примером хорошей статьи.
Любая помощь в целом.
Пожалуйста , не отвечайте на этот вопрос, если считаете, что с помощью double
(или long double
, или long long double
) можно легко решить эту проблему. Если вы так думаете, значит, вы не понимаете, о чем идет речь.