piOut5 method
Implementation
bool piOut5( int prec, int count, int order ){
int N = ClipMath.log( prec.toDouble() ) ~/ ClipMath.log( 2 ); // 繰り返し回数。log2(prec)程度の反復でよい。
MPData T = MPData();
if( start == 0 ){
mp.set( a, mp.F( "1" ) );
switch( order ){
case 0 : mp.fsqrt3( T, mp.F( "2" ), prec ); break;
case 1 : mp.fsqrt ( T, mp.F( "2" ), prec ); break;
default: mp.fsqrt2( T, mp.F( "2" ), prec, order ); break;
}
mp.fdiv( b, mp.F( "1" ), T, prec );
mp.fdiv( t, mp.F( "1" ), mp.F( "4" ), prec );
mp.set( p, mp.F( "1" ) );
}
MPData U = MPData();
for( int i = 0; i < count; i++ ){
mp.fadd( T, a, b );
mp.fmul( U, T, mp.F( "0.5" ), prec );
mp.fmul( T, a, b, prec );
switch( order ){
case 0 : mp.fsqrt3( b, T, prec ); break;
case 1 : mp.fsqrt ( b, T, prec ); break;
default: mp.fsqrt2( b, T, prec, order ); break;
}
mp.fsub( T, a, U );
mp.fmul( T, T, T, prec );
mp.fmul( T, p, T, prec );
mp.fsub( t, t, T );
mp.fmul( p, mp.F( "2" ), p, prec );
mp.set( a, U );
start++;
}
mp.fadd( T, a, b );
mp.fmul( T, T, T, prec );
mp.fmul( U, mp.F( "4" ), t, prec );
mp.fdiv2( pi, T, U, prec );
return (start < N);
}