Calcular a raiz do cubo de um número


12

O objetivo deste código golf é criar um programa ou função que calcule e produza a raiz do cubo de um número que é fornecido como entrada.
As regras:

  • Nenhum recurso externo
  • Nenhum uso de funções raiz do cubo interno.
  • Nenhum uso de métodos / operadores que podem elevar um número a uma potência (que inclui raiz quadrada, quarta raiz, etc.).
  • Sua função / programa deve poder aceitar números de ponto flutuante e números negativos como entrada.
  • Se a raiz do cubo for um número de ponto flutuante, arredonde-o para 4 números após o ponto decimal.
  • Este é um código de golfe, o código mais curto em bytes vence.

Casos de teste:

27 --> 3
64 --> 4
1  --> 1
18.609625 --> 2.65
3652264 --> 154
0.001 --> 0.1
7  --> 1.9129

Você pode usar todos os casos de teste acima para testar números negativos ( -27 --> -3, -64 --> -4...)


caramba, se você permitisse apenas números com cubo preciso, eu teria um bom golfe
yo '

1
A julgar pelos seus casos de teste, presumo que o programa só precise lidar com números reais?
user12205

@ace add complex e altero 2 letras no meu código;)
yo '

2
O arredondamento para 4 dígitos após o ponto decimal é um requisito forte? Ou poderia ser algo como "você não precisa mostrar mais de quatro dígitos após o ponto decimal"?
Victor Stafusa 22/02

Com referência à minha resposta usando Exp (ln (x) / 3) (e vários clones dele), esclareça se Exp é permitido. Presumo pow (x, 1/3) não é (mesmo que ele não é tecnicamente uma função raiz cúbica.)
Nível River St

Respostas:


6

J: 16 caracteres

Tradução solta da resposta Haskell:

-:@((%*~)+])^:_~

Casos de teste:

   -:@((%*~)+])^:_~27
3
   -:@((%*~)+])^:_~64
4
   -:@((%*~)+])^:_~1
1
   -:@((%*~)+])^:_~18.609625
2.65
   -:@((%*~)+])^:_~3652264
154
   -:@((%*~)+])^:_~0.001
0.1
   -:@((%*~)+])^:_~7
1.91293

Funciona assim:

     (-:@((% *~) + ])^:_)~ 27
↔ 27 (-:@((% *~) + ])^:_) 27
↔ 27 (-:@((% *~) + ])^:_) 27 (-:@((% *~) + ])) 27
↔ 27 (-:@((% *~) + ])^:_) -: ((27 % 27 * 27) + 27)
↔ 27 (-:@((% *~) + ])^:_) 13.5185
↔ 27 (-:@((% *~) + ])^:_) 27 (-:@((% *~) + ])) 13.5185
↔ 27 (-:@((% *~) + ])^:_) -: ((27 % 13.5185 * 13.5185) + 13.5185)
↔ 27 (-:@((% *~) + ])^:_) 6.83313
...

Em palavras:

half =. -:
of =. @
divideBy =. %
times =. *
add =. +
right =. ]
iterate =. ^:
infinite =. _
fixpoint =. iterate infinite
by_self =. ~

-:@((%*~)+])^:_~ ↔ half of ((divideBy times by_self) add right) fixpoint by_self

Não é uma das melhores traduções verbais, já que há um garfo diádico e o ~direito no final.


19

Haskell - 35

c n=(iterate(\x->(x+n/x/x)/2)n)!!99

Exemplo é executado:

c 27  =>  3.0
c 64  =>  4.0
c 1  =>  1.0
c 18.609625  =>  2.6500000000000004  # only first 4 digits are important, right?
c 3652264  =>  154.0
c 0.001  =>  0.1
c 7  =>  1.9129311827723892
c (-27)  =>  -3.0
c (-64)  =>  -4.0

Além disso, se você importar Data.Complex, ele funciona em números complexos, mas retorna uma das raízes do número (existem 3):

c (18:+26)  =>  3.0 :+ 1.0

O :+operador deve ser lido como 'mais i vezes'


1
Isso merece um +1. Estive refatorando algas de enésima raiz generalizada durante a última hora e agora cheguei ao mesmo resultado. Bravo.
primo

@primo Lembrei-me instantaneamente de todos os algoritmos de aproximação de n-ésima raiz e, depois de desistir das séries Taylor / Maclaurin na APL, usei isso.
Mniip

Usando o método de Newton que obtive x=(2*x+n/x/x)/3, você pode explicar por que pode usar x=(x+n/x/x)/2? Ela converge mais lento, mas eu não posso explicar por que converge ...
Michael M.

@ Michael, porque se você tomar x=cbrt(n), então x=(x+n/x/x)/2é verdade. Então é verdade para sua expressão
mniip


7

SageMath, (69) 62 bytes

No entanto, nunca acredite que isso lhe dará o resultado, é muito difícil analisar aleatoriamente todos os números:

def r(x):
 y=0
 while y*y*y-x:y=RR.random_element()
 return "%.4f"%y

se você não insistiu em truncar:

def r(x):
 y=0
 while y*y*y-x:y=RR.random_element()
 return y

SageMath, 12 bytes, se expfor permitido

Funciona para todas as coisas: positivo, negativo, zero, complexo, ...

exp(ln(x)/3)

Eu acredito que você está usando um operador que pode elevar um número a uma potência.
user12205

ah ok, certo, editado
yo '

6
+1 para um algoritmo monumentalmente estúpido que ainda satisfaz os requisitos.
Caracol mecânico

@Mechanicalsnail Thanks. Espero que seja óbvio que o que faço é uma espécie de recessão: D No entanto, se expfor permitido, tenho menos de 12 anos e não sou idiota :)
yo '

Considerando que expé a abreviação de "função exponencial", que é "uma função cujo valor é uma constante aumentada para o poder do argumento, especialmente a função em que a constante é e." E não há "nenhum uso de métodos / operadores que pode elevar um número a uma potência ", expnão é permitido.
mbomb007

5

Python - 62 bytes

x=v=input()
exec"x*=(2.*v+x*x*x)/(v+2*x*x*x or 1);"*99;print x

Avalia com precisão total de ponto flutuante. O método usado é o método de Halley . Como cada iteração produz três vezes mais dígitos corretos que a anterior, 99 iterações são um pouco exageradas.

Entrada / saída:

27 -> 3.0
64 -> 4.0
1 -> 1.0
18.609625 -> 2.65
3652264 -> 154.0
0.001 -> 0.1
7 -> 1.91293118277
0 -> 1.57772181044e-30
-2 -> -1.25992104989

Como é que isso funciona?
justhalf 22/02

1
@ justhalf Acho que esse é o método de aproximação de Newton basicamente.
yo

Btw, falha em0
yo '

Falha -2, desculpe por isso.
yo

3
@plg A descrição do problema proíbe o uso de qualquer função exponencial; caso contrário, v**(1/.3)seria um vencedor.
primo

3

Javascript (55)

function f(n){for(i=x=99;i--;)x=(2*x+n/x/x)/3;return x}

BÔNUS, Formulação geral para todas as raízes
function f(n,p){for(i=x=99;i--;)x=x-(x-n/Math.pow(x,p-1))/p;return x}

Para raiz do cubo, basta usar f(n,3), raiz quadrada f(n,2), etc ... Exemplo: f(1024,10)retorna 2.

Explicação
Com base no método de Newton:

Encontre:, f(x) = x^3 - n = 0a solução é n = x^3
A derivação:f'(x) = 3*x^2

Iterar:
x(i+1) = x(i) - f(x(i))/f'(x(i)) = x(i) + (2/3)*x + (1/3)*n/x^2

Testes

[27,64,1,18.609625,3652264,0.001,7].forEach(function(n){console.log(n + ' (' + -n + ') => ' + f(n) + ' ('+ f(-n) +')')})

27 (-27) => 3 (-3)
64 (-64) => 4 (-4)
1 (-1) => 1 (-1)
18.609625 (-18.609625) => 2.65 (-2.65)
3652264 (-3652264) => 154 (-154)
0.001 (-0.001) => 0.09999999999999999 (-0.09999999999999999)
7 (-7) => 1.912931182772389 (-1.912931182772389) 

Um caractere mais curto:function f(n){for(i=x=99;i--;)x-=(x-n/x/x)/3;return x}
copie

Pode ser reduzida para 47 bytesf=(n)=>eval('for(i=x=99;i--;)x=(2*x+n/x/x)/3')
Luis Felipe de Jesus Munoz

2

PHP - 81 bytes

Solução iterativa:

$i=0;while(($y=abs($x=$argv[1]))-$i*$i*$i>1e-4)$i+=1e-5;@print $y/$x*round($i,4);

O que acontece se ele tentar calcular a raiz do cubo igual a zero?
Victor Stafusa

Ele apenas emitirá "0" (graças ao operador de supressão de erros - "@").
Razvan

1
0.0001pode ser substituído por 1e-4e 0.00001por 1e.5.
ComFreek 22/02

Isso requer PHP <7 ( 0/0fornecido NANno PHP 7). $i=0;é desnecessário (-5 bytes. Se não forfosse , economizaria um byte.) O espaço após printnão é necessário (-1 byte). -Rpode salvar 3 bytes com $argn.
Titus

Salve um parênteses com while(1e-4+$i*$i*$i<$y=abs($x=$argn))(-2 bytes).
Titus

2

Perl, 92 bytes

sub a{$x=1;while($d=($x-$_[0]/$x/$x)/3,abs$d>1e-9){$x-=$d}$_=sprintf'%.4f',$x;s/\.?0*$//;$_}
  • A função aretorna uma string com o número sem uma parte de fração desnecessária ou zeros insignificantes na extremidade direita.

Resultado:

              27 --> 3
             -27 --> -3
              64 --> 4
             -64 --> -4
               1 --> 1
              -1 --> -1
       18.609625 --> 2.65
      -18.609625 --> -2.65
         3652264 --> 154
        -3652264 --> -154
           0.001 --> 0.1
          -0.001 --> -0.1
               7 --> 1.9129
              -7 --> -1.9129
 0.0000000000002 --> 0.0001
-0.0000000000002 --> -0.0001
               0 --> 0
              -0 --> 0

Gerado por

sub test{
    my $a = shift;
    printf "%16s --> %s\n", $a, a($a);
    printf "%16s --> %s\n", "-$a", a(-$a);
}
test 27;
test 64;
test 1;
test 18.609625;
test 3652264;
test 0.001;
test 7;
test "0.0000000000002";
test 0;

O cálculo é baseado no método de Newton :

Cálculo


2

APL - 31

(×X)×+/1,(×\99⍴(⍟|X←⎕)÷3)÷×\⍳99

Usa o fato de que cbrt(x)=e^(ln(x)/3), mas em vez de fazer exponenciação ingênua , calcula e^xusando a série Taylor / Maclaurin.

Amostras de execuções:

⎕: 27
3
⎕: 64
4
⎕: 1
1
⎕: 18.609625
2.65
⎕: 3652264
154
⎕: 0.001
0.1
⎕: 7
1.912931183
⎕: ¯27
¯3
⎕: ¯7
¯1.912931183

Visto que há uma resposta J em 16 caracteres, devo ser realmente terrível na APL ...


2

Java, 207 182 181

Às vezes, quando jogo golfe, tomo duas cervejas e jogo muito mal

class n{public static void main(String[]a){double d=Double.valueOf(a[0]);double i=d;for(int j=0;j<99;j++)i=(d/(i*i)+(2.0*i))/3.0;System.out.println((double)Math.round(i*1e4)/1e4);}}

O método iterativo de aproximação de Newton, executa 99 iterações.

Aqui está o unGolfed:

class n{
    public static void main(String a[]){
        //assuming the input value is the first parameter of the input
        //arguments as a String, get the Double value of it
        double d=Double.valueOf(a[0]);
        //Newton's method needs a guess at a starting point for the 
        //iterative approximation, there are much better ways at 
        //going about this, but this is by far the simplest. Given
        //the nature of the problem, it should suffice fine with 99 iterations
        double i=d;

        //make successive better approximations, do it 99 times
        for(int j=0;j<99;j++){
            i=( (d/(i*i)) + (2.0*i) ) / 3.0;
        }
        //print out the answer to standard out
        //also need to round off the double to meet the requirements
        //of the problem.  Short and sweet method of rounding:
        System.out.println( (double)Math.round(i*10000.0) / 10000.0 );
    }
}

1
Você pode renomear a argsvariável para algo como z, reduzindo 6 caracteres. Você pode remover o espaço e as chaves no corpo do loop for, reduzindo 3 caracteres. Você pode substituir 10000.0por 1e4, reduzindo 6 caracteres. A classe não precisa ser pública, para que você possa reduzir mais 7 caracteres. Dessa forma, será reduzido para 185 caracteres.
Victor Stafusa

O elenco no final é realmente necessário? Não faz para mim.
Victor Stafusa 22/02

@ Victor Obrigado pelo bom olho, o uso da notação E para o dobro 10000.0 foi uma ideia espetacularmente boa. Pelo desenho da questão, acho que é legítimo transformar esse método em vez de em uma classe cli em funcionamento, o que reduziria consideravelmente o tamanho. Com Java, não achei que tivesse uma chance, então errei do lado do funcional.
Md_rasler

Bem-vindo ao CodeGolf! Não se esqueça de adicionar uma explicação em resposta de como isso funciona!
25714 Justin justin

@ Quincunx, Obrigado, fez a alteração recomendada.
Md_rasler

2

TI-Basic, 26 24 bytes

Input :1:For(I,1,9:2Ans/3+X/(3AnsAns:End

Isso usa diretamente o ^operador, não é? É proibido pelas regras
mniip

@mniip: Existe e^um único operador na série TI-83? Não me lembro. De qualquer maneira, está violando o espírito das regras.
Caracol mecânico

@ Mecanicalsnail Não importa, eu diria. Na maioria dos idiomas, você pode simplesmente fazer exp(ln(x)/3)ou e^(ln(x/3))se você permitir um desses dois. Mas de alguma forma eu entendo exp(ln(x)/a)como equivalente demais x^(1/a)para ser permitido pelas regras: - /
yo '

Função exponencial: "uma função cujo valor é uma constante elevada à potência do argumento , especialmente a função em que a constante é e". ... "Não utilização de métodos / operadores que pode elevar um número a uma potência"
mbomb007

Obrigado pela captura @ mbomb007, escrevi esta resposta há mais de 3 anos e corrigirei para que esteja em conformidade agora.
Timtech 28/02

2

Js 57 bytes

f=(x)=>eval('for(w=0;w**3<1e12*x;w++);x<0?-f(-x):w/1e4')

f=(x)=>eval('for(w=0;w**3<1e12*x;w++);x<0?-f(-x):w/1e4')
document.getElementById('div').innerHTML += f(-27) + '<br>'
document.getElementById('div').innerHTML += f(-64) + '<br>'
document.getElementById('div').innerHTML += f(-1) + '<br>'
document.getElementById('div').innerHTML += f(-18.609625) + '<br>'
document.getElementById('div').innerHTML += f(-3652264) + '<br>'
document.getElementById('div').innerHTML += f(-0.001) + '<br>'
document.getElementById('div').innerHTML += f(-7) + '<br><hr>'
document.getElementById('div').innerHTML += f(27) + '<br>'
document.getElementById('div').innerHTML += f(64) + '<br>'
document.getElementById('div').innerHTML += f(1) + '<br>'
document.getElementById('div').innerHTML += f(18.609625) + '<br>'
document.getElementById('div').innerHTML += f(3652264) + '<br>'
document.getElementById('div').innerHTML += f(0.001) + '<br>'
document.getElementById('div').innerHTML += f(7) + '<br>'
<div id="div"></div>


2

Javascript: 73/72 caracteres

Esse algoritmo é coxo e explora o fato de que essa pergunta é limitada a 4 dígitos após o ponto decimal. É uma versão modificada do algoritmo que sugeri na sandbox com o objetivo de refazer a pergunta. Ele conta de zero a infinito enquanto h*h*h<a, apenas com um truque de multiplicação e divisão para lidar com a pecisão de 4 dígitos decimais.

function g(a){if(a<0)return-g(-a);for(h=0;h*h*h<1e12*a;h++);return h/1e4}

Editar, 4 anos depois: Conforme sugerido por Luis felipe De jesus Munoz, o uso **do código é mais curto, mas esse recurso não estava disponível em 2014 quando escrevi esta resposta. De qualquer forma, ao usá-lo, raspamos um caractere extra:

function g(a){if(a<0)return-g(-a);for(h=0;h**3<1e12*a;h++);return h/1e4}

1
Em vez disso h*h*hvocê pode fazer h**3e salvar 1 byte
Luis Felipe de Jesus Munoz

@LuisfelipeDejesusMunoz Esta resposta é de 2014. O **operador foi proposto em 2015 e foi aceito como parte do ECMAScript 7 em 2016. Então, na época em que escrevi isso, não havia nenhum **idioma.
Victor Stafusa

1

Javascript - 157 caracteres

Esta função:

  • Lidar com números negativos.
  • Lidar com números de apontador flutuante.
  • Execute rapidamente para qualquer número de entrada.
  • Tem a precisão máxima permitida para números de ponto flutuante javascript.
function f(a){if(p=q=a<=1)return a<0?-f(-a):a==0|a==1?a:1/f(1/a);for(v=u=1;v*v*v<a;v*=2);while(u!=p|v!=q){p=u;q=v;k=(u+v)/2;if(k*k*k>a)v=k;else u=k}return u}

Versão explicada ungolfed:

function f(a) {
  if (p = q = a <= 1) return a < 0 ? -f(-a)      // if a < 0, it is the negative of the positive cube root.
                           : a == 0 | a == 1 ? a // if a is 0 or 1, its cube root is too.
                           : 1 / f (1 / a);      // if a < 1 (and a > 0) invert the number and return the inverse of the result.

  // Now, we only need to handle positive numbers > 1.

  // Start u and v with 1, and double v until it becomes a power of 2 greater than the given number.
  for (v = u = 1; v * v * v < a; v *= 2);

  // Bisects the u-v interval iteratively while u or v are changing, which means that we still did not reached the precision limit.
  // Use p and q to keep track of the last values of u and v so we are able to detect the change.
  while (u != p | v != q) {
    p = u;
    q = v;
    k = (u + v) / 2;
    if (k * k * k > a)
      v=k;
    else
      u=k
  }

  // At this point u <= cbrt(a) and v >= cbrt(a) and they are the closest that is possible to the true result that is possible using javascript-floating point precision.
  // If u == v then we have an exact cube root.
  // Return u because if u != v, u < cbrt(a), i.e. it is rounded towards zero.
  return u
}

1

PHP, 61

Baseado no método de Newton. Versão ligeiramente modificada da resposta de Michael :

for($i=$x=1;$i++<99;)$x=(2*$x+$n/$x/$x)/3;echo round($x,14);

Funciona com números negativos, pode lidar com números de ponto flutuante e arredonda o resultado para 4 números após o ponto decimal, se o resultado for um número de ponto flutuante.

Demonstração de trabalho


Você pode salvar dois bytes com for($x=1;++$i<100;).... Mas o uso de variáveis ​​predefinidas como entrada geralmente é desaprovado . Melhor uso $argv[1]ou $argn.
Titus

1

Befunge 98 - Trabalhos em andamento

Este idioma não suporta números de ponto flutuante; isso tenta imitá-los. Atualmente, ele funciona para números positivos que não iniciam 0após o ponto decimal (principalmente). No entanto, ele gera apenas 2 casas decimais.

&5ka5k*&+00pv
:::**00g`!jv>1+
/.'.,aa*%.@>1-:aa*

Ele funciona inserindo a parte antes do ponto decimal, multiplicando-o por 100000, inserindo a parte após o ponto e adicionando os dois números. A segunda linha faz um contador até que o cubo seja maior que o número inserido. Em seguida, a terceira linha extrai o número decimal do número inteiro.

Se alguém puder me dizer por que a terceira linha se divide apenas 100para obter os valores corretos, diga-me.

IOs:

27.0       3 .0
64.0       4 .0
1.0        1 .0
18.609625  2 .65
0.001      0 .1
7.0        1 .91

0.1        0 .1

1

Smalltalk, 37

o crédito vai para o mniip para o algoritmo; Versão Smalltalk do seu código:

entrada em n; saída em x:

1to:(x:=99)do:[:i|x:=2*x+(n/x/x)/3.0]

ou, como um bloco

[:n|1to:(x:=99)do:[:i|x:=2*x+(n/x/x)/3.0].x]

1

Idioma do GameMaker, 51 bytes

for(i=x=1;i++<99;1)x=(2*x+argument0/x/x)/3;return x

0

Haskell: 99C

Não pode vencer @mniip com esperteza. Eu apenas fui com uma pesquisa binária.

c x=d 0 x x
d l h x
 |abs(x-c)<=t=m
 |c < x=d m h x
 |True=d l m x
 where m=(l+h)/2;c=m*m*m;t=1e-4

Ungolfed:

-- just calls the helper function below
cubeRoot x = cubeRoot' 0 x x

cubeRoot' lo hi x
    | abs(x-c) <= tol = mid           -- if our guess is within the tolerance, accept it
    | c < x = cubeRoot' mid hi x      -- shot too low, narrow our search space to upper end
    | otherwise = cubeRoot' lo mid x  -- shot too high, narrow search space to lower end
    where
        mid = (lo+hi)/2
        cubed = mid*mid*mid
        tol = 0.0001

Você pode usar um operador de infixo para d(como (l#h)x) salvar um byte para cada chamada. centão se torna id>>=(0#).
Esolanging Fruit

Você pode remover espaços ao redor c < x.
Esolanging Fruit

Você pode usar em 1>0vez de True.
Esolanging Fruit

0

J 28

*@[*(3%~+:@]+(%*~@]))^:_&|&1

Usando o método Newtons, encontrar a raiz da x^3 - Xetapa de atualização é x - (x^3 - C)/(3*x^2), onde x é a suposição atual e C a entrada. Fazer as matemáticas nesse caso produz a expressão ridiculamente simples de (2*x+C/x^2) /3. É preciso ter cuidado com números negativos.

Implementado em J, da direita para a esquerda:

  1. | Tome abs dos dois argumentos, passe-os adiante
  2. ^:_ Faça até convergência
  3. (%*~@])é C / x^2( *~ yé equivalente a y * y)
  4. +:@] é 2 x
  5. 3%~divida por três. Isso produz a raiz positiva
  6. *@[ * positive_root multiplica raiz positiva com o sinal de C.

Execução de teste:

   NB. give it a name:
   c=: *@[*(3%~+:@]+(%*~@]))^:_&|&1
   c 27 64 1 18.609625 3652264 0.001 7
3 4 1 2.65 154 0.1 1.91293

0

AWK, 53 bytes

{for(n=x=$1;y-x;){y=x;x=(2*x+n/x/x)/3}printf"%.4g",y}

Exemplo de uso:

$ awk '{for(n=x=$1;y-x;){y=x;x=(2*x+n/x/x)/3}printf"%.4g",y}' <<< 18.609625 
2.65$

Agradecemos a @Mig pela JavaScriptsolução da qual isso é derivado. É executado surpreendentemente rapidamente, uma vez que o forloop requer que a iteração pare de mudar.


0

C, 69 bytes

i;float g(float x){for(float y=x;++i%999;x=x*2/3+y/3/x/x);return x;}

Apenas mais uma implementação do método de Newton. Experimente online!


0

Stax , 10 bytes CP437

╘♀┘A╕äO¶∩'

Execute e depure online!

Explicação

Usa a versão descompactada para explicar.

gpJux*_+h4je
gp              Iterate until a fixed point is found, output the fix point
  Ju            Inverse of square
    x*          Multiplied by input
      _+h       Average of the value computed by last command and the value at current iteration
         4je    Round to 4 decimal digits

0

Solução JAVA

public BigDecimal cubeRoot (número BigDecimal) {

    if(number == null || number.intValue() == 0) return BigDecimal.ZERO;
    BigDecimal absNum = number.abs();
    BigDecimal t;
    BigDecimal root =  absNum.divide(BigDecimal.valueOf(3), MathContext.DECIMAL128);


    do {

        t = root;
        root = root.multiply(BigDecimal.valueOf(2))
                .add(absNum.divide(root.multiply(root), MathContext.DECIMAL128))
                .divide(BigDecimal.valueOf(3), MathContext.DECIMAL128);

    } while (t.toBigInteger().subtract(root.toBigInteger()).intValue() != 0);

    return root.multiply(number.divide(absNum), MathContext.DECIMAL128);
}

1
Bem-vindo ao PPCG! Esse é um desafio de código-golfe , o que significa que o objetivo é resolvê-lo com o menor código possível (contado em bytes do arquivo de origem). Você deve mostrar algum esforço para otimizar sua solução para esse objetivo e incluir a contagem de bytes em sua resposta.
Martin Ender

0

Solução Python

def cube_root(num):
    if num == 0:
        return 0

    t = 0
    absNum = abs(num)
    root = absNum/3

    while (t - root) != 0:
        t = root
        root = (1/3) * ((2 * root) + absNum/(root * root))

    return root * (num / absNum)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.