Felagund 15 de set. de 2010
BigDecimal#setScale
use
BigDecimal valor = new BigDecimal ( "0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" ). setScale ( 50 );
bezier_curve 15 de set. de 2010
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 15 de set. de 2010
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 15 de set. de 2010
Nessas horas eu gosto muito desse fórum…
Luv_sic 16 de set. de 2010
Simplesmente fantástico.
Vou dissecar esse código linha por linha.
Obrigado!