There are times when a method of calculating the square root of a number is needed in SASS; for example calculating the sides of a right triangle, when the length of the hypotenuse is known, or the other way around, for a triangle mixin.
SASS provides us with some basic number operations, and there are libraries which implement more advanced math functions, but I wanted to experiment.
Using Newton’s method algorithm from Wikipedia, transcribed in SCSS scripting, we get the following:
@function sqrt($r) { $x0: 1; // initial value $solution: false; @for $i from 1 through 10 { @if abs(2 * $x0) < 0,00000000000001 { // Don't want to divide by a number smaller than this $solution: false; } $x1: $x0 - ($x0 * $x0 - abs($r)) / (2 * $x0) !global; @if ( abs($x1 - $x0) / abs($x1)) < 0,0000001 { // 7 digit accuracy is desired $solution: true; } $x0: $x1; } @if $solution == true { // If $r is negative, then the output will be multiplied with <a href="http://en.wikipedia.org/wiki/Imaginary_number">i = √-1</a> // (√xy = √x√y) => √-$r = √-1√$r @if $r < 0 { @return $x1 #{i}; } @else { @return $x1; } } @else { @return "No solution"; } }
Which works, but looks too complicated.
We can simplify it into,
@function sqrt($r) { $x0: 1; $x1: $x0; @for $i from 1 through 10 { $x1: $x0 - ($x0 * $x0 - abs($r)) / (2 * $x0); $x0: $x1; } @return $x1; }
Note: By default SASS computations are done with a precision of 5 decimals, if you need a higher precision use the “–precision N” (where N is the number of decimals) flag when compiling.