| Square Root |
| |
| A simple iterative algorithm is used to compute the greatest integer |
| less than or equal to the square root. Essentially, this is Newton's |
| linear approximation, computed by finding successive values of the |
| equation: |
| |
| x[k]^2 - V |
| x[k+1] = x[k] - ------------ |
| 2 x[k] |
| |
| ...where V is the value for which the square root is being sought. In |
| essence, what is happening here is that we guess a value for the |
| square root, then figure out how far off we were by squaring our guess |
| and subtracting the target. Using this value, we compute a linear |
| approximation for the error, and adjust the "guess". We keep doing |
| this until the precision gets low enough that the above equation |
| yields a quotient of zero. At this point, our last guess is one |
| greater than the square root we're seeking. |
| |
| The initial guess is computed by dividing V by 4, which is a heuristic |
| I have found to be fairly good on average. This also has the |
| advantage of being very easy to compute efficiently, even for large |
| values. |
| |
| So, the resulting algorithm works as follows: |
| |
| x = V / 4 /* compute initial guess */ |
| |
| loop |
| t = (x * x) - V /* Compute absolute error */ |
| u = 2 * x /* Adjust by tangent slope */ |
| t = t / u |
| |
| /* Loop is done if error is zero */ |
| if(t == 0) |
| break |
| |
| /* Adjust guess by error term */ |
| x = x - t |
| end |
| |
| x = x - 1 |
| |
| The result of the computation is the value of x. |
| |
| ------------------------------------------------------------------ |
| This Source Code Form is subject to the terms of the Mozilla Public |
| # License, v. 2.0. If a copy of the MPL was not distributed with this |
| # file, You can obtain one at http://mozilla.org/MPL/2.0/. |