Проект основан на исходниках (на С++) библиотеки MPIR, Edition 3.0.0. Полностью написан на С/С++. Скорость на порядок выше предыдущего решения на C#.NET. Реализовал два блока в проекте: 1.DLL c COM интерфейсом. Реализованы dual-интерфейсы с Automation-совместимыми типами данных, структур (поддержка как раннего вывязывания, так и позднего). Ранний предпочтительнее в части скорости (на 50% быстрее). Реализовано два класса: класс целых чисел с арифметикой (BignumArithmeticInteger) и класс чисел с плавающей точкой (BignumArithmeticFloat). При создании экземпляра класса создается массив из 256 чисел с арифметикой. К числам можно обращаться по номерам (была задумка ввести имя, но оправдывает ли это удобство потери в скорости?) BignumArithmeticInteger (Bignum) увеличивается в памяти по мере расчета автоматически, перераспределяя память. BignumArithmeticFloat (Bignum), задается изначально, т.к. дробь может быть бесконечной (по умолчанию принимается минимальный размер). Размер чисел ничем не ограничен, кроме вашей оперативки.
Регистрация COM реализовано как под админом, так и под пользователем (актуально в офисной части клиентов) Регистрация стандартная: Админ: Regsvr32 "...\полный путь\FulName.DLL" Пользователь: Regsvr32 /i /n "...\полный путь\FulName.DLL"
Примеры использования см. ниже.
2.XLL для Excel с C API - функциями. Добавил базовый набор. Будет потребность в дополнительных - добавлю по запросу. Для функций создано два раздела в стандартном списке с названиями классов в COM (+один общий). Функции поддерживают многопоточные расчеты. Работа с функциями как с обычными (различий нет). Обычные написаны тоже на С/С++ под C API.
В XLL ресурсы упакована COM.DLL, распаковывается и устанавливается под пользователем - автоматом. Поэтому открываем XLL или устанавливаем как надстройку - готово (ничего регистрировать не надо). Пишем код в VBA и работаем. Советую раннее связывание. Видим свойства и методы объекта. Оные можно посмотреть и в диспетчере объектов (см. рис.)
Примеры см. ниже.
Где тестировалось: VBA:
Код
Sub RUN() 'ЗАПУСКАЕМ ДЛЯ РАННЕГО СВЯЗЫВАНИЯ
'On Error Resume Next
ThisWorkbook.VBProject.References.AddFromGuid "{77D79CA3-15A0-4310-B8D8-0BCBE3F72D96}", 1, 0: Continue ' подключаем библу "BedvitCOM" в References - version(1.0) для раннего связывания (если библа уже подключена - On Error Resume Next)
'Для раннего связывания сначала включаем в References библу, потом в конце кода отключаем. Для позднего связывания этого не нужно (см.ниже).
'Если BedvitCOM не оключать, могут быть ошибки в этом файле при отсутствии зарегестрированной BedvitCOM - выслали кому-то файл, или открыли из другого ПК и т.д., где не установлеена или не открыта надстройка BedvitXLL (которая автоматом распаковывает и регистрирует библиотеку BedvitCOM в реестре) или не зарегистрированна BedvitCOM вручную
End Sub
Sub Continue() '(через индексы - расширенный пример)
Dim I As BignumArithmeticInteger: Set I = New BignumArithmeticInteger 'Создаем массив целых больших чисел и арифметикой (класс)
Dim F As BignumArithmeticFloat: Set F = New BignumArithmeticFloat 'Создаем массив больших чисел с плавающей точкой и арифметикой (класс)
I.Bignum(1) = "111" & String$(100, "1") 'добавляем число из 103 единиц в первое целое длинное число
I.BignumSet 1, "111" & String$(100, "1") 'или так
F.SizeBits(1) = 256 'задаем размер в битах для 1го числа с плавающей точкой
F.SizeBits(2) = 256 'задаем размер в битах для 2го числа с плавающей точкой
F.SizeBits(3) = 256 'задаем размер в битах для 3го числа с плавающей точкой
F.Bignum(1) = I.Bignum(1) 'копируем данные из одного класса чисел в другой (из первого в первое)
F.Clone 2, 1 'копируем в рамках одного класса число из первого во второе, т.е. число 2 = числу 1
'в рамках одного класса такое копирование на порядки быстрее
F.Sum 3, 2, 1 'суммируем в 3е число первое и второе: число3 = число2 + число1
'логика всей арифметики в классах предполагает получение результата в первом параметре(левой части выражения) по аналогии с "x =..."
Debug.Print F.Bignum(3) 'смотрим результат в третьем числе
'2.222222222222222222222222222222222222222222222222222222222222222222222222222222E+102
I.Help 'смотрим Help
F.FileGet 3, "C:\1\1.txt" 'сохраняем 3-е число в файл "C:\1\1.txt"
F.Clear 1 'освобождаем память для 1-го числа объекта F (число =0)
F.Clear 'освобождаем память для всего объекта F (число =0)
I.Clear 'освобождаем память для всего объекта I (число =0)
ThisWorkbook.VBProject.References.Remove ThisWorkbook.VBProject.References("BedvitCOM") 'оключаем библу в References
End Sub
1С:
Код
F = Новый COMОбъект("BedvitCOM.BignumArithmeticDouble"); //Создаем массив больших чисел с плавающей точкой и арифметикой (класс)
F.SizeBitsSet(1,256); //задаем размер в битах для 1го числа с плавающей точкой
F.SetBignum(1, "11111"); //присваиваем данные для 1го числа
F.Power(1,1,51561); //возводим в степень 51561 первое число и кладем его в первое же число.
f = F.Bignum(1); //кладем данные в переменную из первого числа
Сообщить(f); //смотрим
F.Clear(1) 'освобождаем память первого числа
Версия 0.0.0.1 под x64 (x32 - пока не поддерживаю). Прошу протестировать, написать, что хотелось бы видеть в финальной версии. Реализована простенькая справка с интерфейсом (будет интерес - можно причесать красивее). Help:
Скрытый текст
Свойства и Методы BignumArithmeticInteger
1.Help(); HTML Справка (без параметров).
2.BSTR* StringBSTR = Bignum(BYTE Bignum, LONG BignumBase=10) = BSTR* StringBSTR ; Свойство. Принимает и возвращает BSTR* строку StringBSTR (задает число или возвращает значение). Bignum-индекс длинного числа в массиве (0-255). BignumBase-база длинного числа (от 2 до 36), по умолчанию = 10.
3.LONG Val = Sign(BYTE Bignum); Свойство. Возвращает знак длинного числа LONG Val.Возвращает 1 если Bignum > 0, 0 если Bignum = 0, и -1 если Bignum < 0.
4.LONG Val = Even(BYTE Bignum); Свойство. Определяет, является ли Bignum четное или нечетное. Возвращает 1 - Bignum четное, 0 - Bignum нечетное.
5.LONG Val = Compare(BYTE Bignum1, BYTE Bignum2); Метод. Сравнивает два длинных числа. Возвращает 1 если Bignum1 > Bignum2, 0 если Bignum1 = Bignum2, и -1 если Bignum1 < Bignum2.
6.BignumSet(BYTE Bignum, BSTR StringBSTR, LONG BignumBase=10); Метод. Задает число с параметрами аналогичными свойству Bignum()
8.SumL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Суммирует длинное число с обычным. BignumSet = Bignum1 + LONG_PTR(х64:LONG_PTR= LONGLONG, х32:LONG_PTR= LONG)
9.Abs(BYTE BignumSet, BYTE Bignum1); Метод. Возвращает модуль значения из Bignum1 в BignumSet.
10.Negate(BYTE BignumSet, BYTE Bignum1); Метод. Возвращает значение с противоположным знаком из Bignum1 в BignumSet. BignumSet = - Bignum1.
11.Subtract(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Вычитает из одного длинного числа второе. BignumSet = Bignum1 - Bignum2
12.SubtractL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Вычитает из длинного числа обычное. BignumSet = Bignum1 - LONG_PTR.
13.Multiply(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Умножает одно длинное число на второе. BignumSet = Bignum1 * Bignum2.
14.MultiplyL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Умножает длинное число на обычное. BignumSet = Bignum1 * LONG_PTR.
15.Divide(BYTE BignumQuotient, BYTE BignumRemainder, BYTE Bignum1, BYTE Bignum2); Метод. Делит одно длинное число на второе. При делении получаем частное в BignumQuotient, остаток от деления в BignumRemainder = Bignum1 / Bignum2.
16.DivideL(BYTE BignumQuotient, BYTE BignumRemainder, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Делит длинное число на обычное. При делении получаем частное в BignumQuotient, остаток от деления в BignumRemainder = Bignum1 / LONG_PTR.
17.Power(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Возводит в степень LONG_PTR длинное число Bignum1, результат возвращает в BignumSet. BignumSet = Bignum1 ^ LONG_PTR.
19.RootRem(BYTE BignumRoot, BYTE BignumRemainder, BYTE Bignum1, LONG_PTR n_root); Метод. Извлекает корень n_root-степени из Bignum1. Целочисленный результат возвращает в BignumRoot, остаток в BignumRemainder = (n-th root)√ Bignum1.
20.Factorial(BYTE BignumSet, LONG n); Метод. Возвращает в BignumSet факториал n!
21.Fibonacci(BYTE BignumSet, LONG_PTR n); Метод. Возвращает в BignumSet число Фибоначи n. Fn+1 = Fn + Fn-1
22.LucNum(BYTE BignumSet, LONG_PTR n); Метод. Возвращает в BignumSet число Лукоса n. Ln+1 =Ln + Ln-1
23.FileSet(BYTE Bignum, BSTR StringBSTRFileName, LONG BignumBase=10); Метод. Загружает длинное число из файла (*.txt). Принимает BSTR* строку StringBSTRFileName в качестве полного пути и имени файла. Bignum-индекс длинного числа в массиве (0-255). BignumBase-база числа (от 2 до 36), по умолчанию = 10.
24.FileGet(BYTE Bignum, BSTR StringBSTRFileName, LONG BignumBase=10); Метод. Сохраняет длинное число в файл (*.txt). Принимает BSTR* строку StringBSTRFileName в качестве полного пути и имени файла. Bignum-индекс длинного числа в массиве (0-255). BignumBase-база числа (от 2 до 36), по умолчанию = 10.
25.Clear(LONG Bignum=-1); Метод. Освобождает память занятую длинным числом Bignum, или освобождает память занятую всеми числами при заданном параметре по умолчанию = -1.
Свойства и Методы BignumArithmeticFloat
1.Help(); HTML Справка (без параметров).
2.LONG Val = SizeBits(BYTE Bignum, LONG_PTR* pVal) = .LONG Val; Свойство. Задает и возвращает размер длинного числа в БИТАХ LONG Val. Bignum-индекс длинного числа в массиве (0-255).
3.BSTR* String = Bignum(BYTE Bignum, LONG BignumBase=10, LONG_PTR Precision=0, BSTR Separator=”.”, VARIANT_BOOL Exponential=-1) = BSTR* String; Свойство. Принимает и возвращает BSTR* строку String (задает число или возвращает значение). Bignum-индекс длинного числа в массиве (0-255). BignumBase-база длинного числа (от 2 до 36), по умолчанию = 10. Precision – точность (кол-во цифр в числе), по умолчанию = 0 - максимальная (равна заданному размеру в битах). Separator – символ разделителя целой и дробной частей числа, по умолчанию точка(“.”). Exponential – по умолчанию =-1 экспоненциальная запись, 0 – десятичная (в разработке).
(При парсинге строки в число, ожидаемая десятичная точка берется из текущей локали, на системах, предоставляющих localeconv).
4.LONG Val = Sign(BYTE Bignum); Свойство. Возвращает знак длинного числа LONG Val.Возвращает 1 если Bignum > 0, 0 если Bignum = 0, и -1 если Bignum < 0.
5.LONG Val = Compare(BYTE Bignum1, BYTE Bignum2); Метод. Сравнивает два длинных числа. Возвращает 1 если Bignum1 > Bignum2, 0 если Bignum1 = Bignum2, и -1 если Bignum1 < Bignum2.
6.SizeBitsSet(BYTE Bignum, LONG_PTR SizeBits); Метод. Задает размер длинного числа в БИТАХ LONG Val.
7.BignumSet(BYTE Bignum, BSTR StringBSTR, LONG BignumBase=10, BSTR Separator=”.”); Метод. Задает число с параметрами аналогичными свойству Bignum().
9.SumL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Суммирует длинное число с обычным. BignumSet = Bignum1 + LONG_PTR(х64:LONG_PTR= LONGLONG, х32:LONG_PTR= LONG)
10.Abs(BYTE BignumSet, BYTE Bignum1); Метод. Возвращает модуль значения из Bignum1 в BignumSet.
11.Subtract(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Вычитает из одного длинного числа второе. BignumSet = Bignum1 - Bignum2.
12.SubtractL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Вычитает из длинного числа обычное. BignumSet = Bignum1 - LONG_PTR.
13.Multiply(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Умножает одно длинное число на второе. BignumSet = Bignum1 * Bignum2.
14.MultiplyL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Умножает длинное число на обычное. BignumSet = Bignum1 * LONG_PTR.
15.Divide(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Делит одно длинное число на второе. BignumSet = Bignum1 / Bignum2
16.DivideL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Делит длинное число на обычное. BignumSet = Bignum1 / LONG_PTR.
17.Root(BYTE BignumSet, BYTE Bignum1); Метод. Извлекает квадратный корень из Bignum1. Результат возвращает в BignumSet. BignumSet = √ Bignum1.
18.Negate(BYTE BignumSet, BYTE Bignum1); Метод. Возвращает значение с противоположным знаком из Bignum1 в BignumSet. BignumSet = - Bignum1.
19.Power(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Возводит в степень LONG_PTR длинное число Bignum1, результат возвращает в BignumSet. BignumSet = Bignum1 ^ LONG_PTR.
21.FileSet(BYTE Bignum, BSTR StringBSTRFileName, LONG BignumBase=10); Метод. Загружает длинное число из файла (*.txt). Принимает BSTR* строку StringBSTRFileName в качестве полного пути и имени файла. Bignum-индекс длинного числа в массиве (0-255). BignumBase-база числа (от 2 до 36), по умолчанию = 10.
(При парсинге строки в число, ожидаемая десятичная точка берется из текущей локали, на системах, предоставляющих localeconv).
22.FileGet(BYTE Bignum, BSTR StringBSTRFileName, LONG BignumBase=10, LONG_PTR Precision=0); Метод. Сохраняет длинное число в файл (*.txt). Принимает BSTR* строку StringBSTRFileName в качестве полного пути и имени файла. Bignum-индекс длинного числа в массиве (0-255). BignumBase-база числа (от 2 до 36), по умолчанию = 10. Precision – точность (кол-во цифр в числе), по умолчанию = 0 - максимальная (равна заданному размеру в битах).
23.Clear(LONG Bignum=-1); Метод. Освобождает память занятую длинным числом Bignum, или освобождает память занятую всеми числами при заданном параметре по умолчанию = -1
Ресурсы: MPIR library, Edition 3.0.0 (freely distributable librarys) http://mpir.org/ + my code written in C / C ++
Большая работа проведена. А кому такие числа нужны? Финансистам, математикам, астрономам?) Из перечисленных наверное только первые пользуются Excel в той или иной степени.
Критику принимаю, не барышня). Писал для интереса. пользоваться можно любым приложением поддерживающим COM. Сфера применения - вычисления с большой точностью, а так же поклонники нестандартных решений, и тестирование возможностей ПК и программ (для таких, как я).
bedvit, очень мощно! Сохранил в закладки))) спасибо!
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Уважаемый Виталий! Спасибо за большую проделанную работу по предоставлению доступа широкому кругу любителей VBA к одной из самых замечательных математических библиотек!
05/04/2018 - Новая версия BedvitCOM v.1.0.0.2 и BedvitXLL v.1.0.0.2
Изменения: 1. Изменен порядок аргументов в методе "BignumSet" (теперь, как во всех других методах, номер длинного числа в массиве - стоит первым аргументом), см.под спойлером
2. Добавлены новые методы в два класса (запись длинного числа в файл .txt и чтение из файла) .FileSet, .FileGet (описание в .Help и ниже) 3. Собраны библиотеки COM и XLL в 32-разрядной версии (с корректным Help-ом, описанием интерфейса).
Свойства и методы (интерфейс) последней версии библиотеки COM (есть в .Help):
Скрытый текст
interface IBignumArithmeticInteger : IDispatch
[id(1), helpstring("Help")] HRESULT Help();
[propget, id(2), helpstring("Bignum(Bignum-number in the array, BignumBase(optional)=10 - the base may vary from 2 to 36). Convert Bignum/String(BSTR)")] HRESULT Bignum([in] BYTE Bignum, [in, defaultvalue(10L)] LONG BignumBase, [out, retval] BSTR* pVal);
[propput, id(2), helpstring("Bignum(Bignum-number in the array, BignumBase(optional)=10 - the base may vary from 2 to 36). Convert Bignum/String(BSTR)")] HRESULT Bignum([in] BYTE Bignum, [in, defaultvalue(10L)] LONG BignumBase, [in] BSTR newVal);
[propget, id(3), helpstring("Sign(Bignum). Sign Bignum. Return +1 if Bignum > 0, 0 if Bignum = 0, and -1 if Bignum < 0")] HRESULT Sign([in] BYTE Bignum, [out, retval] LONG* pVal);
[id(22), helpstring("LucNum(BignumSet, ULONGLONG n). BignumSet = Ln, the n’th Lucas number")] HRESULT LucNum([in] BYTE BignumSet, [in] ULONGLONG n);};
[id(23), helpstring("FileSet(Bignum-number in the array, StringBSTR - string-in FileName, BignumBase(optional)=10 (2 to 36)). Set Bignum from a file ")] HRESULT FileSet([in] BYTE Bignum, [in] BSTR StringBSTRFileName, [in, defaultvalue(10L)] LONG BignumBase);
[id(24), helpstring("FileGet(Bignum-number in the array, StringBSTR - string-in FileName, BignumBase(optional)=10 (2 to 36)). Get Bignum to a File.")] HRESULT FileGet([in] BYTE Bignum, [in] BSTR StringBSTRFileName, [in, defaultvalue(10L)] LONG BignumBase);
[id(17), helpstring("FileSet(Bignum-number in the array, StringBSTR - string-in FileName, BignumBase(optional)=10 (2 to 36)). Set Bignum from a File.")] HRESULT FileSet([in] BYTE Bignum, [in] BSTR StringBSTRFileName, [in, defaultvalue(10L)] LONG BignumBase);
[id(18), helpstring("FileGet(Bignum-number in the array, StringBSTR - string-in FileName, BignumBase(optional)=10 (2 to 36), Precision(optional) = 0 (0-Max, 1-... - number of digits)). Get Bignum to a File.")] HRESULT FileGet([in] BYTE Bignum, [in] BSTR StringBSTRFileName, [in, defaultvalue(10L)] LONG BignumBase, [in, defaultvalue(0L)] LONGLONG Precision);
24/04/2018 - Новая версия BedvitCOM v.1.0.0.3 и BedvitXLL v.1.0.0.3 (поддержка х32 и х64)
1. Добавлены новые функции в два класса библиотеки COM - арифметика длинных чисел с обычными, т.е. теперь можно совершать арифметические действия длинных чисел с обычными. 2. Добавлен механизм очистки/освобождения памяти как для одного числа, так и для класса/объекта в целом. 3. Сделано новое описание для всех свойств и методов двух классов на русском языке в справке (см. под спойлером и в .HELP) 4. XLL теперь удаляет данные из реестра (COM.DLL) под пользователем при закрытии надстройки.
Список C API - функций в Excel: Блок BedvitXLLBignumArithmeticInteger: 1.ConvertBaseInteger - конвертирование целого числа (строки) из одной базы в другую (от 2 до 36). Блок BedvitXLLBignumArithmeticFloat: 1.SumFloat - сложение двух длинных/обычных чисел с плавающей точкой 2.SubtractFloat - вычитание двух длинных/обычных чисел с плавающей точкой 3.MultiplyFloat - умножение двух длинных/обычных чисел с плавающей точкой 4.DivideFloat - деление двух длинных/обычных чисел с плавающей точкой 5.PowerFloat - возведение в степень длинного/обычного числа 6.RootFloat - извлечение квадратного корня из длинного/обычного числа
Еще раз уточню: при открытии XLL можно работать как с новыми C API функциями, так и с COM.DLL через VBA.
Работать с длинными числами можно не только через индексы, но и через буквенные переменные.
Пример №3: VBA - через буквенное обозначение, позднее связывание
Код
Dim A, B, C: A = 1: B = 2: C = 3
Dim I As Object: Set I = CreateObject("BedvitCOM.BignumArithmeticInteger") 'Создаем массив целых больших чисел и арифметикой (класс)
I.BignumSet A, "12324344435654132546546546564453131" 'задаем данные в число A
I.BignumSet B, "34534534546546546546554665513213211" 'задаем данные в число B
I.Sum C, A, B 'C=A+B
Debug.Print I.Bignum(B) 'смотрим
I.Clear 'освобождаем память для всего объекта I
Пример №4: 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
Свойства и методы последней версии библиотеки COM (есть в .Help, в .Help оформлено красивее):
Скрытый текст
Свойства и Методы BignumArithmeticInteger
1.Help(); HTML Справка (без параметров).
2.BSTR* StringBSTR = Bignum(BYTE Bignum, LONG BignumBase=10) = BSTR* StringBSTR ; Свойство. Принимает и возвращает BSTR* строку StringBSTR (задает число или возвращает значение). Bignum-индекс длинного числа в массиве (0-255). BignumBase-база длинного числа (от 2 до 36), по умолчанию = 10.
3.LONG Val = Sign(BYTE Bignum); Свойство. Возвращает знак длинного числа LONG Val.Возвращает 1 если Bignum > 0, 0 если Bignum = 0, и -1 если Bignum < 0.
4.LONG Val = Even(BYTE Bignum); Свойство. Определяет, является ли Bignum четное или нечетное. Возвращает 1 - Bignum четное, 0 - Bignum нечетное.
5.LONG Val = Compare(BYTE Bignum1, BYTE Bignum2); Метод. Сравнивает два длинных числа. Возвращает 1 если Bignum1 > Bignum2, 0 если Bignum1 = Bignum2, и -1 если Bignum1 < Bignum2.
6.BignumSet(BYTE Bignum, BSTR StringBSTR, LONG BignumBase=10); Метод. Задает число с параметрами аналогичными свойству Bignum()
8.SumL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Суммирует длинное число с обычным. BignumSet = Bignum1 + LONG_PTR(х64:LONG_PTR= LONGLONG, х32:LONG_PTR= LONG)
9.Abs(BYTE BignumSet, BYTE Bignum1); Метод. Возвращает модуль значения из Bignum1 в BignumSet.
10.Negate(BYTE BignumSet, BYTE Bignum1); Метод. Возвращает значение с противоположным знаком из Bignum1 в BignumSet. BignumSet = - Bignum1.
11.Subtract(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Вычитает из одного длинного числа второе. BignumSet = Bignum1 - Bignum2
12.SubtractL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Вычитает из длинного числа обычное. BignumSet = Bignum1 - LONG_PTR.
13.Multiply(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Умножает одно длинное число на второе. BignumSet = Bignum1 * Bignum2.
14.MultiplyL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Умножает длинное число на обычное. BignumSet = Bignum1 * LONG_PTR.
15.Divide(BYTE BignumQuotient, BYTE BignumRemainder, BYTE Bignum1, BYTE Bignum2); Метод. Делит одно длинное число на второе. При делении получаем частное в BignumQuotient, остаток от деления в BignumRemainder = Bignum1 / Bignum2.
16.DivideL(BYTE BignumQuotient, BYTE BignumRemainder, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Делит длинное число на обычное. При делении получаем частное в BignumQuotient, остаток от деления в BignumRemainder = Bignum1 / LONG_PTR.
17.Power(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Возводит в степень LONG_PTR длинное число Bignum1, результат возвращает в BignumSet. BignumSet = Bignum1 ^ LONG_PTR.
19.RootRem(BYTE BignumRoot, BYTE BignumRemainder, BYTE Bignum1, LONG_PTR n_root); Метод. Извлекает корень n_root-степени из Bignum1. Целочисленный результат возвращает в BignumRoot, остаток в BignumRemainder = (n-th root)√ Bignum1.
20.Factorial(BYTE BignumSet, LONG n); Метод. Возвращает в BignumSet факториал n!
21.Fibonacci(BYTE BignumSet, LONG_PTR n); Метод. Возвращает в BignumSet число Фибоначи n. Fn+1 = Fn + Fn-1
22.LucNum(BYTE BignumSet, LONG_PTR n); Метод. Возвращает в BignumSet число Лукоса n. Ln+1 =Ln + Ln-1
23.FileSet(BYTE Bignum, BSTR StringBSTRFileName, LONG BignumBase=10); Метод. Загружает длинное число из файла (*.txt). Принимает BSTR* строку StringBSTRFileName в качестве полного пути и имени файла. Bignum-индекс длинного числа в массиве (0-255). BignumBase-база числа (от 2 до 36), по умолчанию = 10.
24.FileGet(BYTE Bignum, BSTR StringBSTRFileName, LONG BignumBase=10); Метод. Сохраняет длинное число в файл (*.txt). Принимает BSTR* строку StringBSTRFileName в качестве полного пути и имени файла. Bignum-индекс длинного числа в массиве (0-255). BignumBase-база числа (от 2 до 36), по умолчанию = 10.
25.Clear(LONG Bignum=-1); Метод. Освобождает память занятую длинным числом Bignum, или освобождает память занятую всеми числами при заданном параметре по умолчанию = -1.
Свойства и Методы BignumArithmeticFloat
1.Help(); HTML Справка (без параметров).
2.LONG Val = SizeBits(BYTE Bignum, LONG_PTR* pVal) = .LONG Val; Свойство. Задает и возвращает размер длинного числа в БИТАХ LONG Val. Bignum-индекс длинного числа в массиве (0-255).
3.BSTR* String = Bignum(BYTE Bignum, LONG BignumBase=10, LONG_PTR Precision=0, BSTR Separator=”.”, VARIANT_BOOL Exponential=-1) = BSTR* String; Свойство. Принимает и возвращает BSTR* строку String (задает число или возвращает значение). Bignum-индекс длинного числа в массиве (0-255). BignumBase-база длинного числа (от 2 до 36), по умолчанию = 10. Precision – точность (кол-во цифр в числе), по умолчанию = 0 - максимальная (равна заданному размеру в битах). Separator – символ разделителя целой и дробной частей числа, по умолчанию точка(“.”). Exponential – по умолчанию =-1 экспоненциальная запись, 0 – десятичная (в разработке).
(При парсинге строки в число, ожидаемая десятичная точка берется из текущей локали, на системах, предоставляющих localeconv).
4.LONG Val = Sign(BYTE Bignum); Свойство. Возвращает знак длинного числа LONG Val.Возвращает 1 если Bignum > 0, 0 если Bignum = 0, и -1 если Bignum < 0.
5.LONG Val = Compare(BYTE Bignum1, BYTE Bignum2); Метод. Сравнивает два длинных числа. Возвращает 1 если Bignum1 > Bignum2, 0 если Bignum1 = Bignum2, и -1 если Bignum1 < Bignum2.
6.SizeBitsSet(BYTE Bignum, LONG_PTR SizeBits); Метод. Задает размер длинного числа в БИТАХ LONG Val.
7.BignumSet(BYTE Bignum, BSTR StringBSTR, LONG BignumBase=10, BSTR Separator=”.”); Метод. Задает число с параметрами аналогичными свойству Bignum().
9.SumL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Суммирует длинное число с обычным. BignumSet = Bignum1 + LONG_PTR(х64:LONG_PTR= LONGLONG, х32:LONG_PTR= LONG)
10.Abs(BYTE BignumSet, BYTE Bignum1); Метод. Возвращает модуль значения из Bignum1 в BignumSet.
11.Subtract(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Вычитает из одного длинного числа второе. BignumSet = Bignum1 - Bignum2.
12.SubtractL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Вычитает из длинного числа обычное. BignumSet = Bignum1 - LONG_PTR.
13.Multiply(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Умножает одно длинное число на второе. BignumSet = Bignum1 * Bignum2.
14.MultiplyL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Умножает длинное число на обычное. BignumSet = Bignum1 * LONG_PTR.
15.Divide(BYTE BignumSet, BYTE Bignum1, BYTE Bignum2); Метод. Делит одно длинное число на второе. BignumSet = Bignum1 / Bignum2
16.DivideL(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Делит длинное число на обычное. BignumSet = Bignum1 / LONG_PTR.
17.Root(BYTE BignumSet, BYTE Bignum1); Метод. Извлекает квадратный корень из Bignum1. Результат возвращает в BignumSet. BignumSet = √ Bignum1.
18.Negate(BYTE BignumSet, BYTE Bignum1); Метод. Возвращает значение с противоположным знаком из Bignum1 в BignumSet. BignumSet = - Bignum1.
19.Power(BYTE BignumSet, BYTE Bignum1, LONG_PTR LONG_PTR); Метод. Возводит в степень LONG_PTR длинное число Bignum1, результат возвращает в BignumSet. BignumSet = Bignum1 ^ LONG_PTR.
21.FileSet(BYTE Bignum, BSTR StringBSTRFileName, LONG BignumBase=10); Метод. Загружает длинное число из файла (*.txt). Принимает BSTR* строку StringBSTRFileName в качестве полного пути и имени файла. Bignum-индекс длинного числа в массиве (0-255). BignumBase-база числа (от 2 до 36), по умолчанию = 10.
(При парсинге строки в число, ожидаемая десятичная точка берется из текущей локали, на системах, предоставляющих localeconv).
22.FileGet(BYTE Bignum, BSTR StringBSTRFileName, LONG BignumBase=10, LONG_PTR Precision=0); Метод. Сохраняет длинное число в файл (*.txt). Принимает BSTR* строку StringBSTRFileName в качестве полного пути и имени файла. Bignum-индекс длинного числа в массиве (0-255). BignumBase-база числа (от 2 до 36), по умолчанию = 10. Precision – точность (кол-во цифр в числе), по умолчанию = 0 - максимальная (равна заданному размеру в битах).
23.Clear(LONG Bignum=-1); Метод. Освобождает память занятую длинным числом Bignum, или освобождает память занятую всеми числами при заданном параметре по умолчанию = -1
12/12/2019 - v 1.0.2.0 Добавлены функции в блок: XLLBignumArithmeticInteger и в блок XLL Теперь основные функции длинной арифметики есть в Excel. Как с целыми числами (включая неполное частное и остаток от деления), так и с плавающей точкой. С точностью до 32734 знака в Excel и с не ограниченной в VBA. Функции по целым числам позволяют выбрать систему счисления IN/OUT.
Теперь расчеты любой точности в Excel еще проще. Открываем надстройку, используем функции, аналогичные стандартным в Excel.
Выделил время, доделал ранее задуманное. Добавил все основные арифметические функции в библиотеку/надстройку .xll: 1.XLLBignumArithmeticInteger - функции для работы с длинными целыми числами. Функции: 1.1 SumInteger - сложение двух длинных/обычных целых чисел 1.2 SubtractInteger - вычитание двух длинных/обычных целых чисел 1.3 MultiplyInteger - умножение двух длинных/обычных целых чисел 1.4 DivideInteger - деление двух длинных/обычных целых чисел - Неполное частное 1.5 ModInteger - деление двух длинных/обычных целых чисел - Остаток от деления 1.6 PowerInteger - возведение в степень длинного/обычного целого числа 1.7 ConvertBaseInteger - конвертирование целого числа (строки) из одной базы в другую (от 2 до 36). 1.8 FactorialInteger - факториал задаваемого числа.
2.XLLBignumArithmeticFloat - функции для работы с длинными дробными числами. Функции: 2.1 SumFloat - сложение двух длинных/обычных чисел с плавающей точкой 2.2 SubtractFloat - вычитание двух длинных/обычных чисел с плавающей точкой 2.3 MultiplyFloat - умножение двух длинных/обычных чисел с плавающей точкой 2.4 DivideFloat - деление двух длинных/обычных чисел с плавающей точкой 2.5 PowerFloat - возведение в степень длинного/обычного числа 2.6 RootFloat - извлечение квадратного корня из длинного/обычного числа
Для сложения/умножения добавил возможность передавать массив в качестве аргумента функции (суммировать/умножать все элементы массива, как в стандартных функциях Excel). Последние версии надстройки всегда здесь.
bedvit, круто — спасибо! А прочему тема не в Копилке?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous, на мой взгляд здесь несколько/какая либо из причин: 1. Проект набрал мало голосов, возможно по причине узкой специализации. 2. Написан не на VBA, что не позволяет скопировать часть функционала в свой проект, использовать наработки в своих vba-проектах и как следствие п.3 3. Написан как отдельная надстройка/библиотека, т.е открывается/устанавливается отдельно. 4. Нельзя посмотреть код. Без открытого кода, неясно, что за кот в мешке. На самом деле все исходники у меня лежат на гитхабе, планирую их все открыть. Пока не причесал и не открыл доступ, могу любые запрошенные функции опубликовать здесь. 5. Возможно для копилки нужен больший функционал - здесь жду пожелания. 6. Копилка - итоговый вариант проекта, здесь же проект развивается, хоть и медленно, возможно, еще рано, с учётом п.5. 7. Нельзя использовать в Оf365? Нет его у меня, не могу протестировать.
Есть правда и некие плюсы проекта написанного отдельно в xll: 8. Легко интегрируется - открыл xll, все - можно пользоваться всеми доп.функциями, с учетом п.7 9. Написан на Си, поэтому работает очень быстро 10. Весь код написан мной + стандартные библиотеки + MPIR/GMP, т.е гарантируется отсутствие вредоносного кода сообществом разработчиков и моей репутацией, как разработчика. В дальнейшем гарантией будет открытый код.
bedvit, как по мне более-менее актуален только первый пункт Я и сам не использую и пока не планирую, т.к. просто не работаю с такими числами, однако, я однозначно за Копилку, а пока как минимум можно в Курилку преместить, т.к. в общей ветке тема уж точно лишняя
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄