Длинная арифметика, длинное число (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. вносим код в обычный модуль, смотрим
Листинг программы
  1. Option Explicit
  2. Sub Test()
  3. Dim LN As Object
  4. Dim LN2 As Object
  5. Set LN = CreateObject("LongNum")
  6. Set LN2 = CreateObject("LongNum")
  7. LN.LString = "4.564464545656464647E+45665" 'парсинг строки и строки в экспоненциальной записи в LongNum
  8. 'LN2.l = LN.l 'копия из LN в LN2 вариант1
  9. LN.Copy LN2 'копия из LN в LN2 вариант2
  10. LN2.LString = "65655654" 'парсинг строки и строки в экспоненциальной записи в LongNum
  11. LN2.LNum = 65655654 'в числовом формате
  12. 'LN.l = LN.Multiply(LN, LN2) 'умножить вариант 1
  13. Set LN = LN.Multiply(LN, LN2) 'умножить вариант 2
  14. Debug.Print "Вывести: строка= " & LN.LString
  15. Debug.Print "Вывести: в экспоненциальной записи= " & LN.LString("E5") 'E5 - 5 знаков в мантиссе, после запятой
  16. Debug.Print Application.Run("Fact", 50) 'бонус :)
  17. LN.Help 'Справка
  18. Debug.Print LN.HelpString 'Справка в строке
  19. StrPrint [a1], LN.LString
  20. End Sub
  21. Public Sub StrPrint(Cell As Range, ByVal s As String) 'вывести в ячейку/ки длинное число
  22. Dim x As Long, l As Long
  23. l = Len(s)
  24. For x = 0 To l \ 32766
  25. Cell.Offset(0, x) = "'" & Mid$(s, 32766 * x + 1, 32766)
  26. Next
  27. End Sub
Ввод: строка, экспоненциальной запись (с любой степенью), Long Вывод: строка (обычная - по умолчанию, и экспоненциальная запись (с задаваемой мантиссой) Какие мнения?

Решение задачи: «Длинная арифметика, длинное число (LongNum) для VBA - .DLL / .XLL»

textual
Листинг программы
  1. Sub test_new()
  2.     Dim lng As Object, t1 As Single, t2 As Single
  3.     Set lng = CreateObject("LongNum")
  4.     t1 = Timer
  5.     lng.String = "9"
  6.     Set lng = lng.Power(999999)
  7.     Set lng = lng.Add(lng)
  8.     t2 = Timer
  9.     StrPrint [a1], lng.String
  10.     Debug.Print t2 - t1, Timer - t2
  11. End Sub
  12. Public Sub StrPrint(Cell As Range, ByVal s As String)
  13. Dim x As Long, l As Long
  14. l = Len(s)
  15. For x = 0 To l \ 32766
  16. Cell.Offset(0, x) = "'" & Mid$(s, 32766 * x + 1, 32766)
  17. Next
  18. End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.714 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут