Muitas casas decimais

5 respostas
Luv_sic

Sempre que eu procuro por isso, acho gente querendo diminuir casas, o meu problema é justamente o contrário, eu quero aumentar.
Quero calcular PI com 50 casas decimais.
Tô apanhando da classe BigDecimal(ô classezinha chata), não tô sabendo fixar a quantidade de casas decimais. Se alguém puder me explicar, agradeço.

A título de curiosidade, estou utilizando essa equação:

Com double é brincadeira de criança. Pra aumentar as casas também deve ser, mas eu sou uma criança lesada. :?

5 Respostas

Felagund

BigDecimal#setScale

use

BigDecimal valor = new BigDecimal("0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").setScale(50);
B

Fiquei interessado. Dá um pouco de trabalho, mas cheguei ao seguinte resultado:

import java.util.*;
import java.math.*;
class Pi {
    public Pi (int casas) {
		this.casas = casas;
		this.folga = 2;
		mc = new MathContext (casas + folga, RoundingMode.HALF_EVEN);
		eps = BigDecimal.ONE.scaleByPowerOfTen (- (casas + folga));
	}
	private static long numerador (int k) {
		// 4(8k+4)(8k+5)(8k+6) - 2(8k+1)(8k+5)(8k+6) -1 (8k+1)(8k+4)(8k+6) -1 ((8k+1)(8k+4)(8k+5)
		int _8k = 8 * k;
		int _8k1 = _8k + 1;
		int _8k4 = _8k + 4;
		int _8k5 = _8k + 5;
		int _8k6 = _8k + 6;
		return 4L * _8k4 * _8k5 * _8k6
		     - 2L * _8k1 * _8k5 * _8k6
           - (long) _8k1 * _8k4 * _8k6
           - (long) _8k1 * _8k4 * _8k5;
	}
	private static long denominador (int k) {
		// (8k+1)(8k+4)(8k+5)(8k+6)
		int _8k = 8 * k;
		int _8k1 = _8k + 1;
		int _8k4 = _8k + 4;
		int _8k5 = _8k + 5;
		int _8k6 = _8k + 6;
		return (long) _8k1 * _8k4 * _8k5 * _8k6;
	}
	private BigDecimal factor (BigDecimal _16k, int k) {
		return BigDecimal.valueOf (numerador(k)).divide (_16k.multiply (BigDecimal.valueOf (denominador(k))), mc);
	}
	public BigDecimal calc() {
		BigDecimal ret = BigDecimal.ZERO;
		BigDecimal _16k = BigDecimal.ONE;
		BigDecimal _16 = BigDecimal.valueOf (16L);
		int k = 0;
		BigDecimal f;
		do {
			f = factor (_16k, k);
			ret = ret.add (f);
			_16k = _16k.multiply (_16);
			k++;
		} while (f.abs().compareTo (eps) >= 0);
		return ret.plus (new MathContext (casas+1, RoundingMode.HALF_EVEN));
	}
	private int casas;
	private int folga;
	private MathContext mc;
	private BigDecimal eps;

    public static void main (String[] args) {
	    BigDecimal pi = (new Pi (50)).calc();
//            1         2         3         4         5		
//   12345678901234567890123456789012345678901234567890
// Esperado: 3.141592653589793238462643383279502884197169399375105820974944592307816406286...
// Impresso: 3.14159265358979323846264338327950288419716939937511
		System.out.printf ("Pi com 50 casas: %s%n", pi);
	}
}
Felagund

bezier curve:
Fiquei interessado. Dá um pouco de trabalho, mas cheguei ao seguinte resultado:

Caramba cara que que vc fumou pra fazer tudo isso? auhauhauh

Muito legal

ViniGodoy

Nessas horas eu gosto muito desse fórum…

Luv_sic

Simplesmente fantástico.
Vou dissecar esse código linha por linha.

Obrigado! :smiley:

Criado 15 de setembro de 2010
Ultima resposta 16 de set. de 2010
Respostas 5
Participantes 4