square root?
BlitzMax Forums/BlitzMax Programming/square root?
| ||
Im trying to make a 2d distance function how do I do square root in blitzmax? thanks |
| ||
sqr(x) ? |
| ||
x^(1/n) where n is the root you wish to find. |
| ||
sqr(x) is simpler. x^(1/n) is faster (so use this if you need a lot of square roots). |
| ||
x^(1/n) is faster (so use this if you need a lot of square roots). no |
| ||
no, what? using sqr(x) for 10 million iterations: 664ms using x^(1/n) for 10 million iterations: 82ms. OK, that's a lot of iterations but the bottom line is, x^(1/n) is eight times faster than Sqr(x). |
| ||
If you don't need the actual distance, but just need to know if A is beyond (or before) a certain distance, you don't even need to calculate the square root... |
| ||
x^(1/n) where n is the root you wish to find. Additionally, where N is a float or a double, otherwise you'll do an integer division and get one for the result no matter what you put in. |
| ||
SuperStrict Local y:Float Local a:Int = MilliSecs() For Local i:Float = 0.0 To 1000000.0 Step 1.0 y = Sqr(i) Next a = MilliSecs()-a Local b:Int = MilliSecs() For Local i:Float = 0.0 To 1000000.0 Step 1.0 y = i^0.5 Next b = MilliSecs()-b Print a+" vs "+b |
| ||
sqr is a lot faster than^1/n since version 1.24 of Max. |
| ||
why don't use lookup tablesSuperStrict Local y:Float Local a:Int = MilliSecs() For Local i:Float = 0.0 To 1000000.0 Step 1.0 y = Sqr(i) Next a = MilliSecs()-a Local b:Int = MilliSecs() For Local i:Float = 0.0 To 1000000.0 Step 1.0 y = i^0.5 Next b = MilliSecs()-b Local arr:Float[1000000] For Local i:Int = 0 To 1000000 Step 1 arr[i] = Sqr(i) Next Local c:Int = MilliSecs() For Local i:Float = 0.0 To 1000000.0 Step 1.0 y = arr[i] Next c = MilliSecs() - c Print a+" vs "+b + " vs " + c |
| ||
sqr is a lot faster than^1/n since version 1.24 of Max. I'm using 1.28 and Sqr() is a lot slower. Unless there's something available via subversion that I don't have. |
| ||
Fredborg's code came up with the same results on my system (e.g. sqr faster than ^1/n) and I am 1.28. @GFK, what are your results with Fredborg's code and what code are you using? |
| ||
You don't actually have to do a square root at all, all it will do is scale the number. If you don't specifically need it to be in a certain range then just use the pre-square-rooted version of the result. |
| ||
It's like an echo in here :-p |
| ||
It's like an echo in here :-p You gave the positive version of the answer while ImaginaryHuman gave the negative one. Both are needed since it's a square root question... :) |
| ||
I see I have sparked contraversy! It's my birthday today too. Yay. |
| ||
sqr() is consistently ~80% faster than the manual approach. Using 1.28 here. |
| ||
sqr(x) uses C code, which is probably why it is faster. |
| ||
29 vs 132 However -- I'm curious if there is any difference on AMD vs. Intel. (Mine was using Intel Core 2 Duo) |
| ||
22 vs 190 On my monolithic AMD |
| ||
It really was my birthday. |
| ||
grats :p |
| ||
Happy birthday Czar. ;) |
| ||
68 vs 187 XPS M1710 Intel Centrino Duo O, and Czar: Happy Birthday! |
| ||
62 vs 162 debug 10 vs 105 release AMD Athalon 64 X2 Dual core Processor 5000+ 2.60 Ghz BMax v1.28 |
| ||
hmm... 34 vs 69 Intel Core 2 Duo, OSX 10.5.3 Probably a lot to do with the compiler/settings too, I imagine. |
| ||
Interesting... Consistently ~ 28 vs 67 Release ~ 79 vs 116 Debug Intel Core Duo, OS X 10.5.2 |