piOut5 method

bool piOut5(
  1. int prec,
  2. int count,
  3. int order
)

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);
}