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

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

Перейти к публикации

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. WalterMort 336 13.04.18 14:24 Сейчас в теме
Имхо удобнее работа была бы не с индексами, а нечто вроде:

Математика = Новый COMОбъект("...");
А = Математика.New_Integer("1232434443");
Б = Математика.New_Integer("3453453454");
В = Математика.Sum(А, Б);

где А, Б, В порожденные ComОбъекты, указывающие на соответствующие числа в математике.
2. bedvit 5 13.04.18 15:20 Сейчас в теме
Так было в первой версии библиотеки (с некоторыми отличиями, математика была в каждом объекте-числе):

А = Новый 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.
3. bedvit 5 13.04.18 15:31 Сейчас в теме
//Нужны буквы, пожалуйста:
А=1; Б=2; В=3;
I = Новый COMОбъект("BedvitCOM.BignumArithmeticInteger")
I.BignumSet(А,"1232434443");
I.BignumSet(Б,"3453453454");
I.Sum(В,А,Б); //В=А+Б

//Потом вывести результат:
значение_длинного_числа = I.Bignum (B); //вернуть строку/длинное число в переменную "значение_длинного_числа"
4. bedvit 5 13.04.18 15:53 Сейчас в теме
+ с индексами проще работать в различных циклах/переборах/итераторах просто подставляя индекс нужного числа.
user1426094; +1 Ответить
Оставьте свое сообщение
Вопросы с вознаграждением
Вакансии
Программист 1С
Дзержинск
зарплата от 130 000 руб. до 160 000 руб.
Полный день

Ведущий разработчик 1С/Заместитель ИТ-директора
Москва
зарплата от 200 000 руб. до 250 000 руб.
Полный день

Программист 1С
Москва
зарплата от 120 000 руб. до 150 000 руб.
Полный день


Архитектор 1С
Москва
зарплата от 200 000 руб.
Полный день