Друзья, всем привет!
Для всех кто любит VBA, решил написать помощник в длинной арифметики.
Это продолжение и наверное завершение моих предыдущих трех тем.
Реализация через .XLL, т.е. все очень просто - устанавливается как надстройка и готово!
Длинное число с математикой работает как экземпляр объекта.
Перегрузка операторов в VBA - мечта, поэтому тупо через свойства и методы.
Скорость работы - более чем в 10 раз быстрее чем все предыдущие решения (!100000=20 сек, 1000000!='8,263931688331240E+5565708 - 50мин.)
Есть справка .Help:
Properties (Name-Type-Description)
1) L - as Object - LongNum
2) LNum - as Int32 - Converts the numeric value (Int32-Holds signed 32-bit (4-byte) integers that range in value from -2,147,483,648 through 2,147,483,647.).
3) LString(Optional format) - as String - Converts the String\Exponential notation (format = "E...", example:"E5"="1.11111E+...")
4) Sign - As Integer - Gets a number that indicates the sign (negative, positive, or zero) of the currentLongNum object.
5) IsEven - As Boolean - Indicates whether the value of the current LongNum object is an even number.
Methods (Name-Return-Description)
1) Addition(LongNum, LongNum, Optional Subtraction) - As LongNum - Adds/Subtracts two LongNum values and returns the result.
2) Copy(LongNum) - No - Specifies the LongNum to which the specified object will be copied
3) Compare(LongNum, LongNum) - As Integer - Compares two LongNum values and returns an integer that indicates whether the first value is less than, equal to, or greater than the second value.
4) Divide(LongNum, LongNum) - As LongNum - Divides one LongNum value by another and returns the result.
5) Factorial(Int32) - As LongNum - Returns a BigInteger value - Factorial of a specified value.
6) Help - Msgbox - Help
7) HelpString - As String - Help
8) Modulus(LongNum, LongNum) - As LongNum - Performs integer division on two LongNum values and returns the remainder.
9) Multiply(LongNum, LongNum) - As LongNum - Returns the product of two LongNum values.
10) Negate(LongNum) - As LongNum - Negates a specified LongNum value.
11) Pow(LongNum, Int32) - As LongNum - Raises a LongNum value to the power of a specified value.
Подключаем .XLL. вносим код в обычный модуль, смотрим :)
Ввод: строка, экспоненциальной запись (с любой степенью), Long
Вывод: строка (обычная - по умолчанию, и экспоненциальная запись (с задаваемой мантиссой)
xll. не пролезают, залил на Яндекс диск:
Для Excelx32 -
Для Excelx64 -
Какие мнения?
Для всех кто любит VBA, решил написать помощник в длинной арифметики.
Это продолжение и наверное завершение моих предыдущих трех тем.
Реализация через .XLL, т.е. все очень просто - устанавливается как надстройка и готово!
Длинное число с математикой работает как экземпляр объекта.
Перегрузка операторов в VBA - мечта, поэтому тупо через свойства и методы.
Скорость работы - более чем в 10 раз быстрее чем все предыдущие решения (!100000=20 сек, 1000000!='8,263931688331240E+5565708 - 50мин.)
Есть справка .Help:
Properties (Name-Type-Description)
1) L - as Object - LongNum
2) LNum - as Int32 - Converts the numeric value (Int32-Holds signed 32-bit (4-byte) integers that range in value from -2,147,483,648 through 2,147,483,647.).
3) LString(Optional format) - as String - Converts the String\Exponential notation (format = "E...", example:"E5"="1.11111E+...")
4) Sign - As Integer - Gets a number that indicates the sign (negative, positive, or zero) of the currentLongNum object.
5) IsEven - As Boolean - Indicates whether the value of the current LongNum object is an even number.
Methods (Name-Return-Description)
1) Addition(LongNum, LongNum, Optional Subtraction) - As LongNum - Adds/Subtracts two LongNum values and returns the result.
2) Copy(LongNum) - No - Specifies the LongNum to which the specified object will be copied
3) Compare(LongNum, LongNum) - As Integer - Compares two LongNum values and returns an integer that indicates whether the first value is less than, equal to, or greater than the second value.
4) Divide(LongNum, LongNum) - As LongNum - Divides one LongNum value by another and returns the result.
5) Factorial(Int32) - As LongNum - Returns a BigInteger value - Factorial of a specified value.
6) Help - Msgbox - Help
7) HelpString - As String - Help
8) Modulus(LongNum, LongNum) - As LongNum - Performs integer division on two LongNum values and returns the remainder.
9) Multiply(LongNum, LongNum) - As LongNum - Returns the product of two LongNum values.
10) Negate(LongNum) - As LongNum - Negates a specified LongNum value.
11) Pow(LongNum, Int32) - As LongNum - Raises a LongNum value to the power of a specified value.
Подключаем .XLL. вносим код в обычный модуль, смотрим :)
| Код |
|---|
Option Explicit
Sub Test()
Dim LN As Object
Dim LN2 As Object
Set LN = CreateObject("LongNum")
Set LN2 = CreateObject("LongNum")
LN.LString = "4.564464545656464647E+45665" 'парсинг строки и строки в экспоненциальной записи в LongNum
'LN2.l = LN.l 'копия из LN в LN2 вариант1
LN.Copy LN2 'копия из LN в LN2 вариант2
LN2.LString = "65655654" 'парсинг строки и строки в экспоненциальной записи в LongNum
LN2.LNum = 65655654 'в числовом формате
'LN.l = LN.Multiply(LN, LN2) 'умножить вариант 1
Set LN = LN.Multiply(LN, LN2) 'умножить вариант 2
Debug.Print "Вывести: строка= " & LN.LString
Debug.Print "Вывести: в экспоненциальной записи= " & LN.LString("E5") 'E5 - 5 знаков в мантиссе, после запятой
Debug.Print Application.Run("Fact", 50) 'бонус :)
LN.Help 'Справка
Debug.Print LN.HelpString 'Справка в строке
StrPrint [a1], LN.LString
End Sub
Public Sub StrPrint(Cell As Range, ByVal s As String) 'вывести в ячейку/ки длинное число
Dim x As Long, l As Long
l = Len(s)
For x = 0 To l \ 32766
Cell.Offset(0, x) = "'" & Mid$(s, 32766 * x + 1, 32766)
Next
End Sub
|
Вывод: строка (обычная - по умолчанию, и экспоненциальная запись (с задаваемой мантиссой)
xll. не пролезают, залил на Яндекс диск:
Для Excelx32 -
Для Excelx64 -
Какие мнения?
«Бритва Оккама» или «Принцип Калашникова»?