Я шукаю хорошу математичну бібліотеку довільної точності на C або C ++. Не могли б ви дати мені кілька порад чи пропозицій?
Основні вимоги:
Він повинен обробляти довільно великі цілі числа - мій головний інтерес - цілі числа. Якщо ви не знаєте, що означає слово довільно велике, уявіть щось на зразок 100000! (факторіал 100000).
Не потрібно вказувати точність під час ініціалізації бібліотеки або створення об’єкта. Точність повинна тільки бути обмежена наявними ресурсами системи.
Він повинен використовувати повну потужність платформи і повинен обробляти “малі” номери. Це означає, що на 64-бітній платформі для обчислення (2 ^ 33 + 2 ^ 32) слід використовувати доступні 64-бітні інструкції процесора. Бібліотека не повинна обчислювати це так само, як це робить з (2 ^ 66 + 2 ^ 65) на тій же платформі.
Він повинен ефективно обробляти додавання (
+
), віднімання (-
), множення (*
), ціле ділення (/
), залишок (%
), потужність (**
), приріст (++
), зменшення (--
), GCD, факторіал та інші загальні цілі арифметичні розрахунки. Здатність обробляти такі функції, як квадратний корінь і логарифм, які не дають цілочисельних результатів, є плюсом. Здатність обробляти символічні обчислення ще краща.
Ось що я знайшов на даний момент:
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
) може легко вирішити цю проблему. Якщо ви так думаєте, ви не розумієте суть питання.