Como pegar a raiz quadrada de um numero em jvascript

Existe uma aproximação rápida de raiz quadrada através de uma equação linear:

L(x) = f(a) + f'(a)*(x-a)

Para um dado valor a em que a função tenha um valor conhecido e f'(_) sendo a derivada da função. Por coincidência, a derivada da raiz quadrada é a metade do inverso da raiz quadrada.

O valor da raiz quadrada é plenamente conhecida em quadrados perfeitos, logo, vamos tratar a como sendo um quadrado perfeito, e f(a) sua raiz inteira.

Logo, a fórmula da aproximação pode ser transformada assim:

(x-a) sqrt_approx(x) = sqrt_int(a) + ------------- 2*sqrt_int(a)

Para a aproximação dar certo, preciso escolher um a próximo o suficiente de x.

Assim, nosso algoritmo agora se resume a:

  1. achar a quadrado perfeito (e sua raiz inteira sqrt_int(a)) o mais próximo de x
  2. aplicar a fórmula

A grosso modo, seria isso:

function sqrt_approx(x) { let sqrt_a = raiz_do_quadrado_mais_proximo(x); let a = sqrt_a * sqrt_a; // se x for um quadrado perfeito, x-a resultará em zero e a resposta será sqrt_a return sqrt_a + (x-a)/(2*sqrt_a); }

Ótimo, agora só falta definir quem é o quadrado mais próximo de x. Como estamos lidando com números reais, não faz sentido investigar raízes de números negativos, logo vou reduzir o conjunto de busca apenas para os positivos. A ideia é bem simples: itero de 0 a infinito, verificando a distância do quadrado da variável de iteração para o x. No momento em que houver uma inflexão (ie, a distância deixar de ser negativa e passar a ser positiva), retorno ou o elemento atual da iteração ou o elemento anterior, de acordo com o quadrado mais próximo de x:

function raiz_do_quadrado_mais_proximo(x) { let i = 0; while (true) { let ii = i * i; if (ii - x > 0) { let dist_ii = x - ii; let dist_ant = x - (i-1)*(i-1); if (dist_ii < 0) { dist_ii *= -1; } if (dist_ant < 0) { dist_ant *= -1; } return dist_ant < dist_ii? i-1: i; } } }

O código acima pode ser otimizado trivialmente para:

function raiz_do_quadrado_mais_proximo(x) { let i = 0; while (i*i < x) { // itera até a inflexão i++; } let dist_ii = i*i - x; // i*i >= x garantido, depois da inflexão, daí dist_ii está sendo calculado já positivo let dist_ant = x - (i-1)*(i-1); // antes da inflexão, x será maior que o quadrado, daí dist_ant está sendo calculado já positivo return dist_ant < dist_ii? i-1: i; }

Juntando tudo, temos:

function faz_leitura(form) { let x = Number(document.getElementById("quad").value); let raiz_apprx = sqrt_approx(x); let err = x - (raiz_apprx * raiz_apprx); if (err < 0) { err = -err; } document.write("<div>Raiz quadrada aproimada de " + x + " é " + raiz_apprx + ", com erro de " + err + "</div>"); } function raiz_do_quadrado_mais_proximo(x) { let i = 0; while (i*i < x) { i++; } let dist_ii = i*i - x; let dist_ant = x - (i-1)*(i-1); return dist_ant < dist_ii? i-1: i; } function sqrt_approx(x) { let sqrt_a = raiz_do_quadrado_mais_proximo(x); let a = sqrt_a * sqrt_a; // se x for um quadrado perfeito, x-a resultará em zero e a resposta será sqrt_a return sqrt_a + (x-a)/(2*sqrt_a); } <form onsubmit="faz_leitura(this); return false;"> <div> <input required type="text" id="quad"/> <label>valor a ser calculada a raiz</label> </div> <button type="submit">SQRT</button> </form>