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

12.04.18

Разработка - Инструментарий разработчика

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
BedvitCOMv1.0.0.2
.zip 376,22Kb ver:1.0.0.2
1
1 Скачать (1 SM) Купить за 1 850 руб.
BedvitCOMv1.0.0.3
.zip 392,02Kb ver:1.0.0.3
0
0 Скачать (1 SM) Купить за 1 850 руб.

В продукте реализованы 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 ++

©2018, BedvitCOM
License: Freely distributable library

 

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

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

MPIR COM ActiveX DLL C/C++ Bignum arithmetic

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

12000 руб.

02.09.2020    172326    964    403    

925

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя. Решение в Реестре отечественного ПО

8400 руб.

20.08.2024    14834    109    46    

108

Пакетная печать Печатные формы Инструментарий разработчика Программист Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

22200 руб.

06.10.2023    17408    44    15    

75

Инструментарий разработчика Программист Платформа 1С v8.3 1C:Бухгалтерия Платные (руб)

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки.

9360 руб.

17.05.2024    27432    96    48    

139

Инструменты администратора БД Инструментарий разработчика Роли и права Программист Платформа 1С v8.3 1C:Бухгалтерия Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

15000 руб.

10.11.2023    11990    45    33    

67

SALE! %

Инструментарий разработчика Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

4800 3840 руб.

14.01.2013    191455    1153    0    

920

Инструментарий разработчика Программист 8.3.14 Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

20000 руб.

07.10.2021    18137    7    32    

42

Инструментарий разработчика Платформа 1С v8.3 1C:Бухгалтерия 1С:ERP Управление предприятием 2 Платные (руб)

Разработка Конструктор автоматизированных рабочих мест "Конструктор АРМ" реализована в виде расширения и является универсальным инструментом для создания АРМ любой сложности в пользовательском режиме.

3600 руб.

27.12.2024    1189    2    0    

5
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. WalterMort 247 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 Ответить
Оставьте свое сообщение