Длинная арифметика, длинное число (LongNum) для VBA - .DLL / .XLL
Формулировка задачи:
Друзья, всем привет!
Для всех кто любит 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
Вывод: строка (обычная - по умолчанию, и экспоненциальная запись (с задаваемой мантиссой)
Какие мнения?
Листинг программы
- 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
Решение задачи: «Длинная арифметика, длинное число (LongNum) для VBA - .DLL / .XLL»
textual
Листинг программы
- Sub test_new()
- Dim lng As Object, t1 As Single, t2 As Single
- Set lng = CreateObject("LongNum")
- t1 = Timer
- lng.String = "9"
- Set lng = lng.Power(999999)
- Set lng = lng.Add(lng)
- t2 = Timer
- StrPrint [a1], lng.String
- Debug.Print t2 - t1, Timer - t2
- 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д