Длинная арифметика (Bignum arithmetic) c COM-интерфейсом (ActiveX) на библиотеках MPIR



Расчеты любой точности в вашем программном продукте, поддерживающем стандарт COM.
Размер/точность длинного числа зависит только от вашей оперативной памяти.
Проект основан на исходниках библиотеки MPIR, Edition 3.0.0.
Полностью написан на С/С++ (COM.DLL).

В продукте реализованы dual-интерфейсы с Automation-совместимыми типами данных и структур (поддержка как раннего связывания, так и позднего). 

Реализовано два класса/объекта:

1. Класс целых чисел с арифметикой (BignumArithmeticInteger

2. Класс чисел с плавающей точкой (BignumArithmeticFloat).

При создании экземпляра класса создается массив из 256 чисел с арифметикой.
К числам можно обращаться по индексам (можно и по буквенным обозначениям, см. код ниже)
BignumArithmeticInteger (Bignum) увеличивается в памяти по мере расчета автоматически, перераспределяя память.
BignumArithmeticFloat (Bignum), задается изначально в битах, т.к. дробь может быть бесконечной (по умолчанию принимается минимальный размер).
Размер чисел ничем не ограничен, кроме вашей оперативной памяти.

Регистрация COM реализовано как под админом, так и под пользователем (актуально в офисной части клиентов)
Регистрация стандартная:
Админ: Regsvr32 "FullName.DLL"
Пользователь: Regsvr32 /i /n "FullName.DLL"

Удалить из реестра: Regsvr32 /u "FullName.DLL"

Пример использования №1. Подключаем/регистрируем библиотеку (разовая операция), пишем код в 1С:

A=1; B=2; C=3;
I = Новый COMОбъект("BedvitCOM.BignumArithmeticInteger"); //Создаем массив целых больших чисел и арифметикой (класс)
I.BignumSet(A,"12324344435654132546546546564453131");  //задаем данные в число A
I.BignumSet(B,"34534534546546546546554665513213211");  //задаем данные в число B
I.Sum(C,A,B); //C=A+B
Сообщить(I.Bignum(C)); //смотрим данные в числе С
I.Clear(); //освобождаем память для всего объекта I

Пример использования №2. Подключаем/регистрируем библиотеку (разовая операция), пишем код в 1С:

I = Новый COMОбъект("BedvitCOM.BignumArithmeticInteger"); //Создаем массив целых больших чисел и арифметикой (класс) (в количестве - 256)
F = Новый COMОбъект("BedvitCOM.BignumArithmeticFloat"); //Создаем массив больших чисел с плавающей точкой и арифметикой (класс) (в количестве - 256)
I.BignumSet (1, "1111111111111111111111111"); //добавляем число из 25 единиц в первое целое длинное число
F.SizeBitsSet(1, 256); //задаем размер в битах для 1го числа с плавающей точкой
F.SizeBitsSet(2, 256); //задаем размер в битах для 2го числа с плавающей точкой
F.SizeBitsSet(3, 256); //задаем размер в битах для 3го числа с плавающей точкой
F.BignumSet(1, I.Bignum(1)); //копируем данные из одного класса чисел в другой (из первого в первое)
F.Clone (2, 1); //копируем в рамках одного класса число из первого во второе, т.е. число 2 = числу 1
//в рамках одного класса такое копирование на порядки быстрее
F.Root (3, 2); //вычисляем корень из второго числа в третье.
//логика всей арифметики в классах предполагает получение результата в первом длинном числе (левой части выражения),
//по аналогии с "=", т.е. число3 = кореньиз(2число)
Сообщить(F.Bignum(3));//сообщить результат из третьего числа
//1.054092553389459777332964462106278508433529513126845217458167652113557491253756E+12
I.Help(); //смотрим Help
F.Clear(3); //освобождаем память 3-го числа
I.Clear(); //освобождаем память для всего объекта I
F.Clear(); //освобождаем память для всего объекта F

Справка (.Help) содержит:

Объект IBignumArithmeticInteger — содержит 25 свойств и методов. 

Объект BignumArithmeticFloat — содержит 23 свойства и метода.

 

Описание свойств и методов:

 

Интерфейс (С/С++) (свойства, методы, краткое описание):

 
Ресурсы:

MPIR library, Edition 3.0.0 (freely distributable librarys)
http://mpir.org/
+ my code written in C / C ++

©2025, BedvitCOM
License: Freely distributable library

 

24/04/2025 — Новая версия BedvitCOM v.1.0.0.3  (поддержка х32 и х64)

1. Добавлены новые функции в два класса библиотеки COM — арифметика длинных чисел с обычными, т.е. теперь можно совершать арифметические действия длинных чисел с обычными.
2. Добавлен механизм очистки/освобождения памяти как для одного числа, так и для класса/объекта в целом.
3. Сделано новое описание для всех свойств и методов двух классов на русском языке в справке (см. под спойлером "Описание свойств и методов" и в .HELP)

4 Comments

  1. WalterMort

    Имхо удобнее работа была бы не с индексами, а нечто вроде:

    Математика = Новый COMОбъект(«…»);

    А = Математика.New_Integer(«1232434443»);

    Б = Математика.New_Integer(«3453453454»);

    В = Математика.Sum(А, Б);

    где А, Б, В порожденные ComОбъекты, указывающие на соответствующие числа в математике.

    Reply
  2. bedvit

    Так было в первой версии библиотеки (с некоторыми отличиями, математика была в каждом объекте-числе):

    А = Новый COMОбъект(«LongNum»);

    Б = Новый COMОбъект(«LongNum»);

    В = Новый COMОбъект(«LongNum»);

    А.String = «1232434443»;

    Б.String = «3453453454»;

    В = А.Add(Б); // B = A + Б

    При тестировании стало понятно, что передача объектов в виде аргументов — более затратный процесс, чем передача индекса.

    Поэтому была придумана текущая конструкция:

    I = Новый COMОбъект(«BedvitCOM.BignumArithmeticInteger»)

    I.BignumSet(1,»1232434443″);

    I.BignumSet(2,»3453453454″);

    I.Sum(3,1,2);

    То же, что и предложенный вариант, но расчет происходит в одном объекте, а не создается 4 (математика и три числа), т.е. I — как класс математики, только вместо обозначения переменных, их индексы. Как писал в топике была возможность заменить индексы на строку (те же А или Б), но в этом случае снижается скорость работы из-за преобразований BSTR в char* и поиск в std::map по ключу-значение, вместо явного индекса в std::vector.

    Reply
  3. bedvit

    //Нужны буквы, пожалуйста:

    А=1; Б=2; В=3;

    I = Новый COMОбъект(«BedvitCOM.BignumArithmeticInteger»)

    I.BignumSet(А,»1232434443″);

    I.BignumSet(Б,»3453453454″);

    I.Sum(В,А,Б); //В=А+Б

    //Потом вывести результат:

    значение_длинного_числа = I.Bignum (B); //вернуть строку/длинное число в переменную «значение_длинного_числа»

    Reply
  4. bedvit

    + с индексами проще работать в различных циклах/переборах/итераторах просто подставляя индекс нужного числа.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *