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