segunda-feira, 7 de outubro de 2013

O poder do VBA no EXCEL: Divisão e Radiciação Binárias

Não me delongarei muito tempo nesta postagem mas deixo abaixo os códigos fontes das funções de Divisão e Radiciação Binárias que desenvolvi.

Quem quiser entender o algoritmo basta copiá-los, colá-los num módulo VBA no Excel e testá-los.

Public Function Divisao(ByVal Dividendo As Double, ByVal Divisor As Double) As Double
   Dim inicio As Long, final As Long, tamanhoQuociente As Long, tamanhoDivisor As Long, potencia As Double, vezes As Long, _
       produto As Double
   Dividendo = Int(Dividendo)
   Divisor = Int(Divisor)
   If Divisor = 0 Then
      Divisao = -1
   ElseIf Divisor = 1 Then
      Divisao = Dividendo
   ElseIf Dividendo = Divisor Then
      Divisao = 1
   ElseIf Dividendo < Dividendo Then
      Divisao = 0
   Else
      vezes = 0
      inicio = 0
      tamanhoQuociente = Len(CStr(Dividendo))
      tamanhoDivisor = Len(CStr(Divisor))
      final = Val(String(tamanhoQuociente - tamanhoDivisor + 1, "9"))
      Do
         vezes = vezes + 1
         Divisao = Int((final + inicio) / 2)
         produto = Divisao * Divisor
         If inicio > final Then
            If produto > Dividendo Then
               Divisao = Divisao - 1
            End If
            Exit Do
         ElseIf produto = Dividendo Then
            Exit Do
         ElseIf produto < Dividendo Then
            inicio = Divisao + 1
         ElseIf produto > Dividendo Then
            final = Divisao - 1
         End If
      Loop
      MsgBox vezes
   End If
End Function
Public Function Radiciacao(ByVal Radicando As Double, ByVal Indice As Long) As Double
   Dim inicio As Long, final As Long, tamanhoRaiz As Long, potencia As Double, vezes As Long
   If Indice = 1 Then
      Radiciacao = Radicando
   ElseIf Radicando = 0 Or Radicando = 1 Then
      Radiciacao = Radicando
   Else
      vezes = 0
      inicio = 0
      Radicando = Int(Radicando)
      tamanhoRaiz = Len(CStr(Radicando))
      final = Val(String(Int(tamanhoRaiz / Indice) + IIf(tamanhoRaiz Mod Indice = 0, 0, 1), "9"))
      Do
         vezes = vezes + 1
         Radiciacao = Int((final + inicio) / 2)
         potencia = Radiciacao ^ Indice
         If inicio > final Then
            If potencia > Radicando Then
               Radiciacao = Radiciacao - 1
            End If
            Exit Do
         ElseIf potencia = Radicando Then
            Exit Do
         ElseIf potencia < Radicando Then
            inicio = Radiciacao + 1
         ElseIf potencia > Radicando Then
            final = Radiciacao - 1
         End If
      Loop
      MsgBox vezes
   End If
End Function