preciso da ajuda de vocês. Estou terminando o trabalho da faculdade e preciso saber a raíz de um determinado numero, tipo assim:
Tenho um numero grande com nDigitos, os quais eu conto ao inseri-los em uma lista.
Tenho um valor (vr) refente a concatenação dos digitos acima em formato BigInteger.
Preciso saber o seguinte:
:arrow: RAIZ (nDigitos-1) de vr
ou seja:
[b]nDigitos = 4; vr = 1331;
Raiz(4-1) de 1331
Resultado = 11[/b]
Ja fiz de tudo e nada deu certo.
Vcs poderia me salvar mais essa vez.
Obrigado
BigDecimal bigDec = new BigDecimal(23.1);
Double result = Math.sqrt(bigDec.doubleValue());
oops, o exemplo q usei foi com BigDecimal. mas funciona com BigInteger tb.
T
thingol
Ocorre que se o número tiver mais de 307 casas decimais, não pode ser transformado em um double (Double.MAX_VALUE = 1,797693134862315708145274237317e+308).
Então não devemos transformar o número para Double para obter sua raiz quadrada se ele tem de funcionar para qualquer BigInteger.
faelcavalcanti
pelo menos foi o que eu interpretei conforme citação comentário retirado do método
agora vendo direitinho, me embananei todo. acho que tava tombando de sono, mas que bosta. era a função sqrt, inverti as bolas.
foi mal “RAM WEB” acabei te complicando né!
victorwss
Não tentei, mas acho que por bissecção sai isso aí:
privatestaticfinalBigDecimalDOIS=newBigDecimal(2);publicstaticBigDecimalraiz(BigDecimalvalor,intprecisao){switch(valor.signum()){case-1:thrownewIllegalArgumentException("Não existe raiz quadrada de número negativo.");case0:returnBigDecimal.ZERO;}BigDecimalmin=BigDecimal.ZERO;BigDecimalmax=valor;BigDecimalpivo=valor.divide(DOIS);finalBigDecimalerroMaximo=BigDecimal.TEN.pow(-precisao);BigDecimalerro=valor.subtract(pivo.multiply(pivo));// while (|valor - pivo^2| > erroMaximo)while(erro.abs().compareTo(erroMaximo)==1){if(erro.signum()==-1){max=pivo;}else{min=pivo;}pivo=min.add(max).divide(DOIS);erro=valor.subtract(pivo.multiply(pivo));}returnpivo;}publicstaticBigDecimalraiz(BigIntegervalor,intprecisao){returnraiz(newBigDecimal(valor),precisao);}
Newton-Raphson é bem melhor. Se quiser, pode usar esse aí como base.
EDIT: Agora analisei o link do thingol, é bem melhor lá.