Powers vs Multiplying

BlitzMax Forums/BlitzMax Programming/Powers vs Multiplying

Drey(Posted 2006) [#1]
I just ran some test..seems Powers are a bit on the slow side. They seem to remain constant in execution regardless of the power size. I would think powers would be more optimized than this.



Vari1 = 2
Local Counter1, Counter2
Local PH
Local EndTime

StartMilli = MilliSecs()
EndTime = StartMilli + 1000

Repeat
	Counter2:+1
	
	PH = Vari1^10

Until EndTime < MilliSecs()

Print "^" + Counter2



StartMilli = MilliSecs()
EndTime = StartMilli + 1000

Repeat
	Counter1:+1
	
	PH = Vari1 * Vari1 * Vari1 * Vari1 * Vari1 * Vari1 * Vari1 * Vari1 * Vari1 * Vari1

Until EndTime < MilliSecs()



Print "*" + Counter1

Delay 100

Print Counter1/Float(Counter2)


End



Dreamora(Posted 2006) [#2]
Problem is: Did you ever try to create a power of 2.72343 in your way? ;-)

It ends up constant becase a^b = a * ln(b) on which ln is the worse and calculation intense part.
If you defined your variables correctly (with type not this sluggish B3D style), you could have used :float which would be faster, because yours uses int which ends with double calculation. Gives more accurate results but takes its time.

I always use * if I know the power and if the power is not > 4 (got used to that in B3D where the multiplication is faster for a^x with x < 4)


N(Posted 2006) [#3]
Well, for one thing...

a^b = a * ln(b)


I don't think that's correct.

For another thing, Pow takes into account fractional numbers and not just integers, so it's more complex than simply multiplying a number by itself n times, hence why it takes longer.

Just thought I'd add that in case you didn't understand Dreamora's gobbledegook.


Dreamora(Posted 2006) [#4]
What do you think is not correct?
The equation itself is.
The actual implementation might differ, since ln is the slowest mathematical operation with non-matrices. but still the implementation bases on this and uses IEEE optimations which use the restriction correctness of the types to gain in speed (as SQRT does as well)


N(Posted 2006) [#5]
So you're saying that 5^2.5 = 5*ln(2.5), right?

If so, my calculator disagrees.


Dreamora(Posted 2006) [#6]
5^2.5 = e^(ln(5^2.5)) = e^(2,5 * ln(5)) = 5 * e^2.5

oops yeah you are right, was wrong, mixed it vice versa :-(


Michael Reitzenstein(Posted 2006) [#7]
.

There is no reason why the compiler can't replace x^c with ( x * x * ... x ) for sufficiently small values of c. Using multiplication is O( n ) and calculating with exp and ln is constant, but a very large one.


Michael Reitzenstein(Posted 2006) [#8]
Um, no, it's still wrong. You can't jump from

exp( 2.5 * ln( 5 ) ) -which is right
to
5 * exp( 2.5 ) -which is wrong


Dreamora(Posted 2006) [#9]
narv yeah its monday morning and boring

I stop telling strange stuff thats crap.