A math question, I suppose

Blitz3D Forums/Blitz3D Programming/A math question, I suppose

_33(Posted 2007) [#1]
I need to have a simple operation to convert a power value to an absolute value. For example 2^23 needs to be converted to 23. Any simple math operation that would permit this? Mod? I'm out of ideas...


GfK(Posted 2007) [#2]
I don't follow.

You want to parse a string "2^23" and retrieve "23"?

Or you want to take the result of 2^23 and get a result of 23 again?


fredborg(Posted 2007) [#3]
Local a = Ceil(2^23)

Local b = 1
While a>2
	a = a/2
	b = b+1
Wend
Print b



Who was John Galt?(Posted 2007) [#4]
Generally, if a=b^c then c=log(a)/log(b)


_33(Posted 2007) [#5]
fredborg, indeed!

Thanks!!! :D

Yet, some problems arise, as this is for use with bit flags:
Graphics 800, 600,32,2
For i = 0 To 31
a = Ceil(2^i)

Local b = 1
While a>2
	a = a/2
	b = b+1
Wend
Print "2^"+i+"="+b
Next
WaitKey()


Nomen luni's idea:
Graphics 800, 600,32,2
For i = 0 To 31
a=2^i
c=Log(a)/Log(2)
Print "2^"+i+"="+c
Next
WaitKey()


Nomen luni's revision 2:
Graphics 800, 600,32,2
For i = 0 To 31
   a=2^i
   c=Log(a) * 1.4427
   Print "2^"+i+"="+a+", which is bit "+c
Next
WaitKey()


Now, this way I can get the bit value, and convert it back to the bit position, very nice. But I guess I'll have to forget using bit 31.


fredborg(Posted 2007) [#6]
Ah, well then this works:
For i = 0 To 31
a = Ceil(2^i)

Local b = -1
While a<>0
	a = a Shr 1
	b = b+1
Wend
Print "2^"+i+"="+b
Next



_33(Posted 2007) [#7]
Maybe I'm wrong, but Nomen's idea seems more a performance crown. :P


H&K(Posted 2007) [#8]
Really ;(

Without running I would have put my money on SHR reather than Log. Oh well


_33(Posted 2007) [#9]
H&K, but what is more performing:
- A solution where you have an undetermined number of Shr in a looped Blitz3D code
- A solution with a single Log() and multiplication
?

But definately, fredborg's idea works for all bit values. Nomen's idea doesn't work for bit 31, from what I tried. Maybe I should just do a bit table LOL. I'm undecided!

Here's the idea:
Function Get_ON_bit(value%)
   Local bit% = -1
   While value <> 0 And bit < 32
      value = value Shr 1
      bit = bit + 1
   Wend
   Return bit
End Function

This is, considering the value only has one bit set, or is masked with one bit.


Who was John Galt?(Posted 2007) [#10]
The log method may not be as speedy as it appears as I imagine the log function is doing some internal loops to come up with an answer.


_33(Posted 2007) [#11]
On my system, "value a = b Shr c" takes 2ns, "value = Log(b)" takes 44ns.

So, considering the odds of performing 30 Shr, vs the very solid 44ns of the Log(), I think fredborg's solution is the best for performance, and is giving 100% of the results I need. And with ferdborg's version, it's even faster than consulting a table in a loop. And if I want to convert absolute value to bit shifted value, that's as simple as "1 Shl 23"...

Cheers.


H&K(Posted 2007) [#12]
So without testing, my money was on the winner ;)