fsqrt2 method

bool fsqrt2(
  1. MPData ret,
  2. MPData a,
  3. int prec,
  4. int order,
)

Implementation

bool fsqrt2( MPData ret, MPData a, int prec, int order ){
	a = clone( a );
	if( fcmp( a, F( "0" ) ) > 0 ){
		MPData g = MPData();
		MPData h = MPData();
		MPData m = MPData();
		MPData n = MPData();
		MPData o = MPData();
		MPData p = MPData();
		MPData q = MPData();
		MPData r = MPData();
		MPData s = MPData();
		MPData t = MPData();
		MPData x = MPData();
		if( fcmp( a, F( "1" ) ) > 0 ){
			fdiv( t, F( "1" ), a, prec );
			set( x, t );
		} else {
			set( x, F( "1" ) );
		}
		fmul( t, x, x, prec );
		fmul( t, a, t, prec );
		fsub( h, F( "1" ), t );
		set( g, F( "1" ) );
		fdiv( m, F( "1" ), F( "2" ), prec );
		if( order >= 3 ){ fdiv( n, F( "3"  ), F( "8"   ), prec ); }
		if( order >= 4 ){ fdiv( o, F( "5"  ), F( "16"  ), prec ); }
		if( order >= 5 ){ fdiv( p, F( "35" ), F( "128" ), prec ); }
		if( order == 6 ){ fdiv( q, F( "63" ), F( "256" ), prec ); }
		do {
			switch( order ){
			case 6 : set( t, q ); break;
			case 5 : set( t, p ); break;
			case 4 : set( t, o ); break;
			case 3 : set( t, n ); break;
			default: set( t, m ); break;
			}
			switch( order ){
			case 6:
				fmul( t, h, t, prec );
				fadd( t, p, t );
				// そのまま下に流す
				continue case_5;
			case_5:
			case 5:
				fmul( t, h, t, prec );
				fadd( t, o, t );
				// そのまま下に流す
				continue case_4;
			case_4:
			case 4:
				fmul( t, h, t, prec );
				fadd( t, n, t );
				// そのまま下に流す
				continue case_3;
			case_3:
			case 3:
				fmul( t, h, t, prec );
				fadd( t, m, t );
			}
			fmul( t, h, t, prec );
			fmul( t, x, t, prec );
			fadd( x, x, t );
			set( g, h );
			fmul( t, x, x, prec );
			fmul( t, a, t, prec );
			fsub( h, F( "1" ), t );
			abs( r, h );
			abs( s, g );
		} while( fcmp( r, s ) < 0 );
		fmul( ret, a, x, prec );
		return false;
	}
	set( ret, F( "0" ) );
	return (fcmp( a, F( "0" ) ) != 0);
}