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);
[propget, id(4), helpstring("Even(Bignum). Determine whether Bignum is odd or even. Return 1 - even, 0 - odd")] HRESULT Even([in] BYTE Bignum, [out, retval] LONG* pVal);
[id(5), helpstring("BignumSet(Bignum-number in the array, StringBSTR - string-in, BignumBase(optional)=10 (2 to 36)). Convert String(BSTR) to Bignum")] HRESULT BignumSet([in] BYTE Bignum, [in] BSTR StringBSTR,[in, defaultvalue(10L)] LONG BignumBase);
[id(6), helpstring("Compare(Bignum1,Bignum2). Compare Bignum1 and Bignum2. Return +1 if Bignum1 > Bignum2, 0 if Bignum1 = Bignum2, and -1 if Bignum1 < Bignum2")] HRESULT Compare([in] BYTE Bignum1, [in] BYTE Bignum2, [out, retval] LONG* pVal);
[id(7), helpstring("Sum(BignumSet, Bignum1, Bignum2). BignumSet = Bignum1 + Bignum2")] HRESULT Sum([in] BYTE BignumSet, [in] BYTE Bignum1, [in] BYTE Bignum2);
[id(8), helpstring("SumL(BignumSet, Bignum1, LONG). BignumSet = Bignum1 + LONG")] HRESULT SumL([in] BYTE BignumSet, [in] BYTE Bignum1, [in] LONG LONG);
[id(9), helpstring("Abs(BignumSet, Bignum1). Set absolute value. BignumSet = Abs(Bignum1)")] HRESULT Abs([in] BYTE BignumSet, [in] BYTE Bignum1);
[id(10), helpstring("Negate(BignumSet, Bignum1). BignumSet = - Bignum1")] HRESULT Negate([in] BYTE BignumSet, [in] BYTE Bignum1);
[id(11), helpstring("Subtract(BignumSet, Bignum1, Bignum2). BignumSet = Bignum1 - Bignum2")] HRESULT Subtract([in] BYTE BignumSet, [in] BYTE Bignum1, [in] BYTE Bignum2);
[id(12), helpstring("SubtractL(BignumSet, Bignum1, ULONG). BignumSet = Bignum1 - LONG")] HRESULT SubtractL([in] BYTE BignumSet, [in] BYTE Bignum1, [in] ULONG ULONG);
[id(13), helpstring("Multiply(BignumSet, Bignum1, Bignum2). BignumSet = Bignum1 * Bignum2")] HRESULT Multiply([in] BYTE BignumSet, [in] BYTE Bignum1, [in] BYTE Bignum2);
[id(14), helpstring("MultiplyL(BignumSet, Bignum1, ULONG). BignumSet = Bignum1 * LONG")] HRESULT MultiplyL([in] BYTE BignumSet, [in] BYTE Bignum1, [in] ULONG ULONG);
[id(15), helpstring("Divide(BignumQuotient, BignumRemainder, Bignum1, Bignum2). BignumQuotient, BignumRemainder = Bignum1 / Bignum2. Divide(BignumQuotient - method 'truncate' , BignumRemainder, Bignum1, Bignum2)")] HRESULT Divide([in] BYTE BignumQuotient, [in] BYTE BignumRemainder, [in] BYTE Bignum1, [in] BYTE Bignum2);
[id(16), helpstring("DivideL(BignumQuotient, BignumRemainder, Bignum1, ULONG). BignumQuotient, BignumRemainder = Bignum1 / ULONG. DivideL(BignumQuotient - method 'truncate' , BignumRemainder, Bignum1, ULONG")] HRESULT DivideL([in] BYTE BignumQuotient, [in] BYTE BignumRemainder, [in] BYTE Bignum1, [in] ULONG ULONG);
[id(17), helpstring("Power(BignumSet, Bignum1, ULONG). BignumSet = Bignum1 #k8SjZc9Dxk ULONG")] HRESULT Power([in] BYTE BignumSet, [in] BYTE Bignum1, [in] ULONG ULONG);
[id(18), helpstring("Clone(BignumSet, Bignum1). BignumSet = Bignum1")] HRESULT Clone([in] BYTE BignumSet, [in] BYTE Bignum1);
[id(19), helpstring("RootRem(BignumSet, Bignum1, ULONG n_root). BignumRoot, BignumRemainder = (n-th root)W30; Bignum1")] HRESULT RootRem([in] BYTE BignumRoot, [in] BYTE BignumRemainder, [in] BYTE Bignum1, [in] ULONG n_root);
[id(20), helpstring("Factorial(BignumSet, ULONG n). BignumSet = !n")] HRESULT Factorial([in] BYTE BignumSet, [in] ULONG n);
[id(21), helpstring("Fibonacci(BignumSet, ULONG n). BignumSet = Fn, the n’th Fibonacci number")] HRESULT Fibonacci([in] BYTE BignumSet, [in] ULONG n);
[id(22), helpstring("LucNum(BignumSet, ULONG n). BignumSet = Ln, the n’th Lucas number")] HRESULT LucNum([in] BYTE BignumSet, [in] ULONG 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);
interface IBignumArithmeticFloat : IDispatch
[id(1), helpstring("Help")] HRESULT Help();
[propget, id(2), helpstring("SizeBits(Bignum). SizeBits - Set/Get bit size Bignum")] HRESULT SizeBits([in] BYTE Bignum, [out, retval] LONG* pVal);
[propput, id(2), helpstring("SizeBits(Bignum). SizeBits - Set/Get bit size Bignum")] HRESULT SizeBits([in] BYTE Bignum, [in] LONG newVal);
[propget, id(3), helpstring("Bignum(Bignum-number in the array, BignumBase(optional)=10 (2 to 36), Precision(optional) = 0 (0-Max, 1-... - number of digits), Separator(optional)='.', Exponential(optional) = 1 (1-Exponential entry, 0 - decimal)). Convert Bignum/String(BSTR)")] HRESULT Bignum([in] BYTE Bignum, [in, defaultvalue(10L)] LONG BignumBase, [in, defaultvalue(0)] LONG Precision, [in, defaultvalue(".")] BSTR Separator, [in, defaultvalue(-1)] VARIANT_BOOL Exponential, [out, retval] BSTR* pVal);
[propput, id(3), helpstring("Bignum(Bignum-number in the array, BignumBase(optional)=10 (2 to 36), Precision(optional) = 0 (0-Max, 1-... - number of digits), Separator(optional)='.', Exponential(optional) = 1 (1-Exponential entry, 0 - decimal)). Convert Bignum/String(BSTR)")] HRESULT Bignum([in] BYTE Bignum, [in, defaultvalue(10L)] LONG BignumBase, [in, defaultvalue(0)] LONG Precision, [in, defaultvalue(".")] BSTR Separator, [in, defaultvalue(-1)] VARIANT_BOOL Exponential, [in] BSTR newVal);
[propget, id(4), 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(5), helpstring("SizeBitsSet(Bignum, SizeBits). Set bit size Bignum")] HRESULT SizeBitsSet([in] BYTE Bignum, [in] LONG SizeBits);
[id(6), helpstring("BignumSet(Bignum-number in the array, StringBSTR - string-in, BignumBase(optional)=10 (2 to 36), Separator(optional)='.'). Convert String(BSTR) to Bignum")] HRESULT BignumSet([in] BYTE Bignum,[in] BSTR StringBSTR, [in, defaultvalue(10L)] LONG BignumBase, [in, defaultvalue(".")] BSTR Separator);
[id(7), helpstring("Compare(Bignum1,Bignum2). Compare Bignum1 and Bignum2. Return +1 if Bignum1 > Bignum2, 0 if Bignum1 = Bignum2, and -1 if Bignum1 < Bignum2")] HRESULT Compare([in] BYTE Bignum1, [in] BYTE Bignum2, [out, retval] LONG* pVal);
[id(8), helpstring("Sum(BignumSet, Bignum1, Bignum2). BignumSet = Bignum1 + Bignum2")] HRESULT Sum([in] BYTE BignumSet, [in] BYTE Bignum1, [in] BYTE Bignum2);
[id(9), helpstring("Abs(BignumSet, Bignum1). Set absolute value. BignumSet = Abs(Bignum1)")] HRESULT Abs([in] BYTE BignumSet, [in] BYTE Bignum1);
[id(10), helpstring("Subtract(BignumSet, Bignum1, Bignum2). BignumSet = Bignum1 - Bignum2")] HRESULT Subtract([in] BYTE BignumSet, [in] BYTE Bignum1, [in] BYTE Bignum2);
[id(11), helpstring("Multiply(BignumSet, Bignum1, Bignum2). BignumSet = Bignum1 * Bignum2")] HRESULT Multiply([in] BYTE BignumSet, [in] BYTE Bignum1, [in] BYTE Bignum2);
[id(12), helpstring("Divide(BignumSet, Bignum1, Bignum2). BignumSet = Bignum1 / Bignum2")] HRESULT Divide([in] BYTE BignumSet, [in] BYTE Bignum1, [in] BYTE Bignum2);
[id(13), helpstring("Root(BignumSet, Bignum1). BignumSet = W30; Bignum1")] HRESULT Root([in] BYTE BignumSet, [in] BYTE Bignum1);
[id(14), helpstring("Negate(BignumSet, Bignum1). BignumSet = - Bignum1")] HRESULT Negate([in] BYTE BignumSet, [in] BYTE Bignum1);
[id(15), helpstring("Power(BignumSet, Bignum1, Bignum2). BignumSet = Bignum1 #k8SjZc9Dxk Bignum2.")] HRESULT Power([in] BYTE BignumSet, [in] BYTE Bignum1, [in] ULONG ULONG);
[id(16), helpstring("Clone(BignumSet, Bignum1). BignumSet = Bignum1")] HRESULT Clone([in] BYTE BignumSet, [in] BYTE Bignum1);
[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)] LONG Precision);
Имхо удобнее работа была бы не с индексами, а нечто вроде:
Математика = Новый COMОбъект(«…»);
А = Математика.New_Integer(«1232434443»);
Б = Математика.New_Integer(«3453453454»);
В = Математика.Sum(А, Б);
где А, Б, В порожденные ComОбъекты, указывающие на соответствующие числа в математике.
Так было в первой версии библиотеки (с некоторыми отличиями, математика была в каждом объекте-числе):
А = Новый 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.
//Нужны буквы, пожалуйста:
А=1; Б=2; В=3;
I = Новый COMОбъект(«BedvitCOM.BignumArithmeticInteger»)
I.BignumSet(А,»1232434443″);
I.BignumSet(Б,»3453453454″);
I.Sum(В,А,Б); //В=А+Б
//Потом вывести результат:
значение_длинного_числа = I.Bignum (B); //вернуть строку/длинное число в переменную «значение_длинного_числа»
+ с индексами проще работать в различных циклах/переборах/итераторах просто подставляя индекс нужного числа.