Solved

Comparing Numbers

Posted on 2002-04-25
14
165 Views
Last Modified: 2010-05-02
I need to compare numbers quickly from the leftmost digit to the right.  

Example:

187787852

is equivallent to

1877814481

up to 18778

I know I can do this with strings, however I would like to do it purely mathematically.

Any ideas?
0
Comment
Question by:cerdmann
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 6
  • 4
  • 2
  • +2
14 Comments
 
LVL 7

Accepted Solution

by:
Z_Beeblebrox earned 200 total points
ID: 6969719
Is this a homework question? What do you mean mathematically, the question does not make sense mathmatically because one number is 187 million and the other is 1.87 billon, so they are not the same for any digits. If you take the last 1 off the second number, then the question makes sense from a mathematical standpoint, in which case you could use division dropping the remainder by each order of ten starting at the highest until the result is different.

Zaphod.
0
 

Author Comment

by:cerdmann
ID: 6969768
I am using the number to represent (via base 8) the location of a node in a tree.

For example 187787852 = 1.63.7.42
(use the 8's as the decimal and clng(&o) the intermediary numbers to get the above.

Also,
1877814481 = 1.63.100.1

So these 2 numbers both fall under the node 1.63 (18778)

Instead of converting them to strings I would like to do the following functions (Example uses 1877814481):
Get parent 144 (100)
Get root 1 (1)
Get common parent (Example given in my first question)

I guess mathematically was incorrect.  I should have said programmatically not using strings.  

I am storing all base 8 numbers as variants cast from a SQL BigInt via cdec().

Could you somehow left shift the bits so that they line up and then do a bitwise comparison?  I have no idea how to do this, but my research has given me this idea.

 
0
 
LVL 16

Expert Comment

by:Richie_Simonetti
ID: 6969789
Some like this?
Function LShift(iVariable As Integer, _
  iNumbits As Integer) As Integer
    LShift = iVariable * (2 ^ iNumbits)
End Function

Function RShift(iVariable As Integer, _
  iNumbits As Integer) As Integer
    RShift = iVariable \ (2 ^ iNumbits)
End Function
0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 16

Expert Comment

by:Richie_Simonetti
ID: 6969797
0
 

Author Comment

by:cerdmann
ID: 6969818
I already saw that article when I was researching this question however, I have never worked at the bit level and could use some help implementing it in my code.

Here is what I have thus far, just for switching between base 10 and base 8 (I know, I am using strings, but these functions will be rarily used)


Option Explicit

Private Sub Form_Load()
  Debug.Print b8ConverttoBase10("1877814481")
  Debug.Print b8ConverttoBase8("1.63.100.1")
End Sub

' =================================================================
' b8ConverttoString
' =================================================================
Public Function b8ConverttoBase10( _
    ByVal Base8Number As Variant) As String

On Error GoTo ErrorHandler

  Dim Base8String     As String
  Dim Base8Level()    As String
  Dim Base10Level()   As String
  Dim Levels          As Long
  Dim ArrayCounter    As Long
  Dim vntDecValue     As Variant
 
  Base8String = CStr(Base8Number)
 
  Base8Level = Split(Base8String, "8")
 
  Levels = UBound(Base8Level)
 
  ReDim Base10Level(Levels)
 
  For ArrayCounter = 0 To Levels
    If Base8Level(ArrayCounter) <> "" Then
      Base10Level(ArrayCounter) = CStr(CDec("&o" & Base8Level(ArrayCounter)))
    End If
  Next
 
  b8ConverttoBase10 = Join(Base10Level(), ".")

  Exit Function
   
ErrorHandler:

  Err.Raise Err.Number, "b8ConverttoString", Err.Description

End Function

' =================================================================
' b8ConverttoBase8
' =================================================================

Public Function b8ConverttoBase8( _
    ByVal Base10String As String) As Variant

On Error GoTo ErrorHandler

  Dim Base8Level()    As String
  Dim Base10Level()   As String
  Dim Levels          As Long
  Dim ArrayCounter    As Long
  Dim Convert         As Variant

 
  Base10Level = Split(Base10String, ".")
 
  Levels = UBound(Base10Level)
 
  ReDim Base8Level(Levels)
 
  For ArrayCounter = 0 To Levels
    Base8Level(ArrayCounter) = Oct$(Base10Level(ArrayCounter))
 
  Next
 
  Convert = CDec(Join(Base8Level(), "8"))
 
  b8ConverttoBase8 = Convert

  Exit Function
   
ErrorHandler:

  Err.Raise Err.Number, "b8ConverttoBase8", Err.Description

End Function

0
 
LVL 7

Expert Comment

by:Z_Beeblebrox
ID: 6969852
Hi, why not convert it to a string, then do the comparison? Would this be much simpler and more readable than using bit manipulation? If I were you I would split the string into an array:

Dim arr() as string
Dim lngIndex as long

arr = split("1877814481","8")
for lngIndex = lbound(arr) to ubound(arr)
   msgbox "Node" & arr(lngIndex)
next

To compare two to see if they have the same parents, just figure out which one is smaller, then iterate through both arrays until one of the elements is different.

Zaphod.
0
 
LVL 7

Expert Comment

by:Z_Beeblebrox
ID: 6969864
BTW, I doubt you are going to find a way to get parent, or get root, purely mathematically. Your number is not a number, it is a sequence of numbers, and as such you should probably treat it as such in code.

Zaphod.
0
 
LVL 8

Expert Comment

by:glass_cookie
ID: 6970301
Hi!

Is this string-cum-numbers mrthod acceptable:

Dim p As Double
p = 1860000111
MsgBox "Original number: " & p

For i = 0 To 5 'For 1st 5 digits
result = p \ 10 ^ (Len(p) + 1 - i)
MsgBox result
p = p - result * 10 ^ (Len(p) + 1 - i)
Next i

That's it!

glass cookie : )
0
 
LVL 3

Expert Comment

by:leojl
ID: 6970660
hi

I agree with Z_B......

do your tests and compare part with string array
approach...then convert to numbers of whatever base
to continue.

leo
0
 

Author Comment

by:cerdmann
ID: 6971805
I think we are going to try a different approach.  Instead of base 8 I think we will limit ourselves to spacing within the number (hhggffeeddccbbaaaa).

Top node would be aaaa followed by bb by cc etc..

The problem is that we only get 7 levels of 99 and a top level of 9999 which actually shouldn't be too big of a problem.

If I make these changes, should I be able to write the functions for manipulating these numbers purely with mathematics?

0
 
LVL 7

Expert Comment

by:Z_Beeblebrox
ID: 6971900
If you do it that way and you have the parent to the right of the child, then you should be able to do everything mathematically, just be careful, the limit in VB for a long is 2 billion, 2,000,000,000, so you can only have 3 levels in your tree.

Zaphod.
0
 

Author Comment

by:cerdmann
ID: 6971907
To find each level now becomes a simple modulus operation.

12080001 =
1
|
8
|
12

12080001 mod 10000 = 1
((12080001 mod 1000000) - (12080001 mod 10000))/10000  = 8
((12080001 mod 100000000) - (12080001 mod 1000000))/1000000 = 12

0
 

Author Comment

by:cerdmann
ID: 6971910
We use SQL Server 2000 BigInt with a VB variant cast with the cdec() command
0
 

Author Comment

by:cerdmann
ID: 6977495
Zaphod helped the most towards determining the right path, so I am awarding the points to him.  Thanks for everyone's help.
0

Featured Post

Announcing the Most Valuable Experts of 2016

MVEs are more concerned with the satisfaction of those they help than with the considerable points they can earn. They are the types of people you feel privileged to call colleagues. Join us in honoring this amazing group of Experts.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

If you have ever used Microsoft Word then you know that it has a good spell checker and it may have occurred to you that the ability to check spelling might be a nice piece of functionality to add to certain applications of yours. Well the code that…
Enums (shorthand for ‘enumerations’) are not often used by programmers but they can be quite valuable when they are.  What are they? An Enum is just a type of variable like a string or an Integer, but in this case one that you create that contains…
Get people started with the process of using Access VBA to control Excel using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Excel. Using automation, an Access application can laun…
This lesson covers basic error handling code in Microsoft Excel using VBA. This is the first lesson in a 3-part series that uses code to loop through an Excel spreadsheet in VBA and then fix errors, taking advantage of error handling code. This l…

733 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question