## SASS sqrt function

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.

1. written by: Ana on December 2, 2016 at 6:32 pm
• written by: Mihai on December 3, 2016 at 8:22 pm