Библиотека для работы с длинными числами Calculation Engine

Главная
Обновления дизассемблера за просмотр рекламы (текущая версия 1.6)
Рекламная пауза
Среда разработки
Совмещение 32 и 64-битного кода
Эпиморфный ассемблер
База данных
Calculation Engine (Длинные числа)
Документация
Копирование сайтов
Ссылки
Гостевая книга
   Еще за долго до создания сайта dsmhelp.narod.ru я писал библиотеку длинной арифметики. Она была 32-битной и называлась calc_engine.dll. Теперь я решил обновить её, исправить некоторые ошибки и портировать на x64 системы. 64-битный вариант называется calceng.dll, в дальнейшем он будет использоваться для обработки вещественных чисел в ассемблере. На исходник к 32-битной версии библиотеки внизу приведена ссылка.
    Библиотека прежде всего содержит реализацию простейших алгоритмов сложения, вычитания, умножения и деления в столбик. Это не самые быстрые способы вычисления, но для образовательных целей в самый раз. Если сложение, вычитание и умножение почти у всех получается сделать, то с делением в столбик у многих возникают затруднения. Новички не редко делят используя логические сдвиги и битовые операции, что для длиных чисел оказывается крайне не эффективным. В исходнике библиотеки calc_engine.Asm можно посмотреть функцию uint_div, которая является относительно правильной реализацией деления в столбик.
    Также в библиотеке есть несколько более сложных функций, таких как факториал, обратный/инверсный факториал, квадратный корень, синус, косинус, вычисление числа П с заданой точностью. Когда писал функцию факториала часто пользовался стандартной программой Калькулятор для проверки правильности своей функции. Там запросто можно было вычислять факториалы 5 значных чисел, пусть и с некоторой задержкой. Теперь на Windows 7 даже факториал 10000 не вычисляется, странный регресс.

Вычисление факториала

    Есть функции конвертирования 80-битных вещественных с плавающей точкой, для возможности обмена с FPU. Оптимальный размер чисел для замены FPU это 515 DWORD`ов для целой части и 514 для дробной. Так как в библиотеке используются числа с фиксированной точкой, то при сложении очень малых чисел с большими, потери точности будут минимальны. Для FPU понятно, что "2+(2^(-66))=2", сколько не прибавляй. Функции библиотеки позволяют обойти это ограничение, хотя и в ущерб производительности, но когда это ограничение существенно ничего не портит, можно конвертировать результаты в 80-битные вещественные и перейти к более быстрым вычислениям на FPU.

Ссылка на исходник библиотеки calceng.zip.