Square root speeds | |

Threshold | Which is faster, Sqrt(X) or X^0.5? What about other methods or ASM equivalents? I need the fastest method possible, specifically for a Distance(X, Y, X2, Y2) function. Any thoughts? Ideas? Experience? |

Threshold | I did a little test, and it's pretty obvious that Sqrt(X) (just Sqr in VB 6.0) is 9 times faster than X^0.5. Here are the numbers I got on my computer (2.3 GHz): Sqrt(X) - 0.00004186 ms X^0.5 - 0.00038296 ms (This is with the compiled EXE. Compiled for fast code with all checkboxes in the Advanced Options window unchecked.) I thought it would be the other way arround, but I guess it makes sense that the Sqrt function is optimized for square roots unlike the ^ operator. Here is the code I used for the test (somewhat of a hack, sorry): [code] Option Explicit Private Const ITERATIONS As Long = 50000000 Private Const VAL As Double = 44.4444444444444 Private Declare Function GetTickCount Lib "kernel32" () As Long Public Sub Main() Dim i As Long Dim dummy As Double Dim Timer As Double Dim lStart As Long Dim lEnd As Long i = 1 lStart = GetTickCount For i = 1 To ITERATIONS dummy = Sqr(VAL) Next i lEnd = GetTickCount Timer = (lEnd - lStart) / ITERATIONS Call MsgBox("Sqrt(i) takes approximately (on average) " & Timer & " milliseconds to compute (with " & CStr(ITERATIONS) & " iterations).", vbInformation, "Sqrt(i)") i = 1 lStart = GetTickCount For i = 1 To ITERATIONS dummy = VAL ^ 0.5 Next i lEnd = GetTickCount Timer = (lEnd - lStart) / ITERATIONS Call MsgBox("i^0.5 takes approximately (on average) " & Timer & " milliseconds to compute (with " & CStr(ITERATIONS) & " iterations).", vbInformation, "i^0.5") End End Sub [/code] I would still appreciate any feedback or other ideas. |

cbx | quote:If you are needing to calculate the distance to move a character but that character only contains a speed, position, and direction properties then you could pre compute the distance to move and store the values in an array. For example say you are making a 2D top down game, And you have a character that only contains speed, position, and direction properties. the direction property would be from 0 to 359 and would represent the angle in degrees, that the character if facing. You could create an 360 indexed array and store pre-computed distance values for each index in the array. But the distance you will compute will only be a distance of 1. So you will end up with an array of 360 items each item in the array would represent the offset or distance to move the character from it's current position. So for example if the character is standing at position 10x12 and is facing 90 degrees (to the right) you would simply add the values in the precomputed array to the characters position and as such the character will then be standing at position 11x12. Character Position = Character Position + direction array(90) or character Position = 10x12 + 1x0 Now if you want to move your character farther then a distance of 1 you simply multiply the values from the direction array by the characters speed, to get the new position of the character. Character Speed = 12.3 Character Position = Character Position + (direction array(90) * Character Speed) or character Position = 10x12 + ((1 * Character Speed)x(0 * Character Speed)) This process should help speed up your code. But I'm guessing that if you really want to speed up your code you could track down the actual math equation to calculate the square root of a number and use that. Code often executes faster if you perform the calculations by hand rather then calling a method to perform the math for you, like the Math.Sqrt (just Sqr in VB 6.0) methods for example. |

cbx | quote:I mentioned in my previous post about how you could calculate the square root of a number by hand, and that doing so may help speed up your code further. But I did not tell you how this is done. Here is a link to a great site [url]http://mathforum.org/dr.math/faq/faq.sqrt.by.hand.html[/url] I have solved/understood many math problems with the help of this site. |

Walrus | Also, the sqr function(VB 6.0) returns a double. It depends on what you're trying to do, but you probably don't need such a precise result. So you can use one of the methods to calculate just an approximation, which might do the trick just as well. |