33 #ifndef __INCLUDE_MIST_DECIMAL_H__
34 #define __INCLUDE_MIST_DECIMAL_H__
37 #ifndef __INCLUDE_MIST_CONF_H__
41 #ifndef __INCLUDE_MIST_LIMITS__
42 #include "../limits.h"
65 namespace __decimal_util__
70 _MIST_CONST(
int, value, log10< N / 10 >::value + 1 );
76 _MIST_CONST(
int, value, 0 );
82 _MIST_CONST(
int, value, 0 );
88 _MIST_CONST(
int, value, 2 * pow2< N - 1 >::value );
94 _MIST_CONST(
int, value, 1 );
99 template <
unsigned int MAX_KETA >
103 typedef unsigned int size_type;
104 typedef int difference_type;
105 typedef unsigned short value_type;
108 _MIST_CONST(
long, RADIXBITS, 15 );
109 _MIST_CONST(
long, RADIX, __decimal_util__::pow2< RADIXBITS >::value );
110 _MIST_CONST(
long, RADIX1, RADIX - 1 );
111 _MIST_CONST(
long, RADIX_2, RADIX / 2 );
112 _MIST_CONST(
long, MAXEXP, __decimal_util__::pow2< RADIXBITS - 1 >::value - 1 );
113 _MIST_CONST(
long, MINEXP, - __decimal_util__::pow2< RADIXBITS - 1 >::value );
117 _MIST_CONST(
long, NMPA, MAX_KETA );
118 _MIST_CONST(
long, NMPA1, NMPA + 1 );
119 _MIST_CONST(
long, NMPA2, NMPA1 * 2 );
120 _MIST_CONST(
long, MMPA, NMPA1 * RADIXBITS * 3 / 40 + 1 );
124 difference_type exp_;
126 value_type data_[ NMPA1 ];
129 decimal( ) : sign_( true ), exp_( 0 ), zero_( true )
131 memset( data_, 0,
sizeof( value_type ) * NMPA1 );
135 decimal(
double a ) : sign_( true ), exp_( 0 ), zero_( true )
137 memset( data_, 0,
sizeof( value_type ) * NMPA1 );
147 while( a >= static_cast< double >( RADIX ) )
150 a /=
static_cast< double >( RADIX );
155 a *=
static_cast< double >( RADIX );
158 difference_type i = 0;
161 data_[ i ] =
static_cast< unsigned int >( a );
164 }
while( a != 0.0 && ++i <= NMPA );
168 decimal(
const double &v, difference_type keta = 16 ) : sign_( true ), exp_( 0 ), zero_( true )
170 memset( data_, 0,
sizeof( value_type ) * NMPA1 );
183 decimal b( static_cast< difference_type >( a ) );
184 a -=
static_cast< difference_type
>( a );
187 for( difference_type i = 0 ; i < keta && a != 0.0 ; i++ )
191 b += decimal( static_cast< difference_type >( a ) );
192 a -=
static_cast< difference_type
>( a );
204 decimal(
const difference_type &m ) : sign_( true ), exp_( 0 ), zero_( true )
206 memset( data_, 0,
sizeof( value_type ) * NMPA1 );
210 difference_type n = m;
217 value_type *p, *q, w;
221 *p++ =
static_cast< value_type
>( n % RADIX );
236 decimal(
const decimal &a ) : sign_( a.sign_ ), exp_( a.exp_ ), zero_( a.zero_ )
238 memcpy( data_, a.data_,
sizeof( value_type ) * NMPA1 );
241 decimal( const ::std::string &str ) : sign_( true ), exp_( 0 ), zero_( true )
243 operator =( read( str ) );
246 const decimal &operator =(
const decimal &a )
253 memcpy( data_, a.data_,
sizeof( value_type ) * NMPA1 );
270 return(
operator =( a ) );
276 else if( sign_ == a.sign_ )
282 int cmp = acmp( *
this, a );
285 return(
operator =( decimal( ) ) );
292 decimal tmp( *
this );
300 return(
operator +=( -a ) );
311 return(
operator =( decimal( ) ) );
314 difference_type i, j, u, r, xp;
315 value_type x[ NMPA2 ];
316 memset( x, 0,
sizeof( value_type ) * NMPA2 );
318 for( i = NMPA, xp = NMPA2 - 1 ; i >= 0 ; i--, xp-- )
323 for( j = NMPA, r = xp ; j >= 0; j--, r-- )
325 u +=
static_cast< size_type
>( data_[ j ] ) * static_cast< size_type >( a.data_[ i ] ) + x[ r ];
326 x[ r ] =
static_cast< value_type
>( u ) & RADIX1;
332 x[ r-- ] =
static_cast< value_type
>( u ) & RADIX1;
337 sign_ = sign_ == a.sign_;
339 for( i = 0, xp = 0 ; i < NMPA2 ; i++, xp++ )
349 ::std::cerr <<
"Error : Overflow!!" << ::std::endl;
350 return(
operator =( maximum( ) ) );
354 ::std::cerr <<
"Error : Underflow!!" << ::std::endl;
355 return(
operator =( decimal( ) ) );
357 for( j = 0 ; ( j <= NMPA ) && ( i < NMPA2 ) ; i++, j++, xp++ )
359 data_[ j ] = x[ xp ];
363 for( ; j <= NMPA ; j++ )
368 else if( x[ xp ] >= RADIX_2 )
370 for( i = NMPA ; ++( data_[ i ] ) & RADIX ; i-- )
372 data_[ i ] &= RADIX1;
386 return(
operator =( decimal( ) ) );
393 difference_type xl =
static_cast< difference_type
>( x );
394 difference_type t = 0, i;
395 for( i = NMPA ; i >= 0 ; i-- )
397 t +=
static_cast< difference_type
>( data_[ i ] * xl );
398 data_[ i ] =
static_cast< value_type
>( t ) & RADIX1;
405 ::std::cerr <<
"Error : Overflow!!" << ::std::endl;
406 return(
operator =( maximum( ) ) );
408 for( i = NMPA ; i > 0 ; i-- )
410 data_[ i ] = data_[ i - 1 ];
412 data_[ i ] =
static_cast< value_type
>( t ) & RADIX1;
429 std::cerr <<
"zero_ division!!" << std::endl;
435 difference_type a0, b0, bcom, cmp, d, i;
439 c.sign_ = a.sign_ == b.sign_;
440 a.sign_ = b.sign_ =
true;
441 if( ( b.data_[ 0 ] << 1 ) & RADIX )
447 bcom = RADIX / ( b.data_[ 0 ] + 1 );
450 c.exp_ = a.exp_ - b.exp_;
452 if( acmp( a, b ) < 0 )
459 b0 = b.data_[ 0 ] + 1;
469 a0 = a0 * RADIX + a.data_[ 1 ];
494 for( i = NMPA, p = c.data_ + i; ++*p & RADIX; i-- )
501 *p++ =
static_cast< value_type
>( d );
505 for( ; i <= NMPA ; i++ )
513 if( acmp( a, b ) < 0 )
528 return(
operator =( c ) );
536 std::cerr <<
"zero division!!" << std::endl;
537 return(
operator =( maximum( ) ) );
544 difference_type i, u, n;
551 if( data_[ 0 ] < static_cast< value_type >( x ) )
562 for( i = n ; i <= NMPA ; i++ )
564 u = ( u << RADIXBITS ) + data_[ i ];
565 data_[ i - n ] =
static_cast< value_type
>( u / x );
570 data_[ i - n ] =
static_cast< value_type
>( ( u << RADIXBITS ) / x );
575 for( i = NMPA ; ++( data_[ i ] ) & RADIX ; i-- )
577 data_[ i ] &= RADIX1;
583 decimal &operator ++( )
589 const decimal operator ++(
int )
591 decimal old_val( *
this );
596 decimal &operator --( )
602 const decimal operator --(
int )
604 decimal old_val( *
this );
609 bool operator ==(
const decimal &a )
const {
return( cmp( *
this, a ) == 0 ); }
610 bool operator !=(
const decimal &a )
const {
return( !( *
this == a ) ); }
611 bool operator < (
const decimal &a )
const {
return( !( *
this >= a ) ); }
612 bool operator <=(
const decimal &a )
const {
return( a >= *
this ); }
613 bool operator > (
const decimal &a )
const {
return( a < *
this ); }
614 bool operator >=(
const decimal &a )
const {
return( cmp( *
this, a ) >= 0 ); }
616 const ::std::string to_string( )
const
618 difference_type nmpa = NMPA;
619 difference_type mmpa = MMPA - 1;
621 if( mmpa < static_cast< difference_type >( std::abs( static_cast< double >( exp_ ) ) ) )
623 decimal tmp( *
this );
626 sprintf( str,
"E%+d", exp_ );
627 return( tmp.to_string( ) + str );
629 else if( *
this == 10000 )
633 else if( *
this == -10000 )
643 unsigned int c[ MMPA ], t[ NMPA1 ], w;
644 difference_type i, cp;
646 for( i = 0 ; i <= mmpa ; i++ )
651 ::std::string s =
"";
665 difference_type n = a.exp_, u, m = 0, mp = -1;
668 for( i = 0 ; i <= n ; i++ )
675 for( i = 0 ; i <= n ; i++ )
677 u = ( u << RADIXBITS ) + t[ i ];
678 t[ i ] =
static_cast< value_type
>( u / 10000 );
681 c[ cp++ ] =
static_cast< value_type
>( u );
685 for( i = 0 ; i <= n ; i++ )
698 for( i = 0 ; i < m - i - 1 ; i++ )
701 c[ i ] = c[ m - i - 1 ];
704 for( i = 0 ; i <= nmpa - ( n + 1 ) ; i++ )
706 a.data_[ i ] = a.data_[ i + n + 1 ];
708 for( ; i <= nmpa ; i++)
725 c[ cp++ ] = a.data_[ 0 ];
730 for( i = 0 ; i < nmpa ; i++ )
732 a.data_[ i ] = a.data_[ i + 1 ];
743 c[ cp++ ] = a.data_[ 0 ];
759 c[ cp++ ] = a.data_[ 0 ];
764 if( c[ mmpa ] < 5000 )
771 for( m = mmpa - 1 ; m >= 0 ; m-- )
774 if( c[ m ] != 10000 )
782 for( i = mmpa ; i >= 0 ; i-- )
811 sprintf( str,
"%04u", c[ cp++ ] );
816 sprintf( str,
"%u", c[ cp++ ] );
824 for( m = 1 ; m <= mmpa ; m++ )
826 sprintf( str,
"%04u", c[ cp++ ] );
847 if( zero_ || exp_ < 0 )
851 else if( exp_ > NMPA )
853 ::std::cerr <<
"Error : Overflow!!" << ::std::endl;
854 return( sign_ ? type_limits< int >::maximum( ) : type_limits< int >::minimum( ) );
859 for( index = 0 ; index <= NMPA ; index++ )
866 if( exp_ >= 3 || ( exp_ == 2 && data_[ 0 ] > 2 ) )
868 ::std::cerr <<
"Error : Overflow!!" << ::std::endl;
869 return( sign_ ? type_limits< int >::maximum( ) : type_limits< int >::minimum( ) );
874 for( i = index ; i <= index + exp_ && i <= NMPA ; i++ )
876 d = d * RADIX + data_[ i ];
878 return( sign_ ? d : -d );
883 double to_double( )
const
891 ::std::cerr <<
"Error : Overflow!!" << ::std::endl;
892 return( type_limits< double >::maximum( ) );
896 ::std::cerr <<
"Error : Underflow!!" << ::std::endl;
897 return( type_limits< double >::minimum( ) );
902 while( a.data_[ 0 ] == 0 )
904 for( i = 0 ; i < NMPA ; i++ )
906 a.data_[ i ] = a.data_[ i + 1 ];
912 double d =
static_cast< double >( a.data_[ 0 ] );
913 for( i = 1; i < 7; i++ )
915 d = d *
static_cast< double >( RADIX ) + static_cast< double >( a.data_[ i ] );
918 if( a.data_[ i ] >= RADIX_2 )
924 d *=
static_cast< double >( RADIX );
929 d /=
static_cast< double >( RADIX );
932 return( a.sign_ ? d : -d );
935 bool is_zero( )
const
941 for( difference_type i = 0 ; i <= NMPA ; i++ )
951 bool is_plus( )
const
958 static decimal maximum( )
965 for( difference_type i = 0 ; i <= NMPA1 ; i++ )
967 max.data_[ i ] = RADIX1;
973 static decimal zero( )
978 static decimal pai( )
981 decimal b0( decimal::sqrt( decimal( 2 ) ) / 2 );
982 decimal t0(
"0.25" );
985 difference_type _2[] = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096 };
986 for(
int n = 0 ; n < 10 ; n++ )
988 a1 = ( a0 + b0 ) / 2;
989 b1 = decimal::sqrt( a0 * b0 );
990 t1 = t0 - _2[ n ] * ( a0 - a1 ) * ( a0 - a1 );
997 return( ( a0 + b0 ) * ( a0 + b0 ) / ( t0 * 4 ) );
1000 static decimal sqrt(
const decimal &a )
1004 return mist::decimal< MAX_KETA >( );
1006 else if( !a.is_plus( ) )
1008 ::std::cerr <<
"Error : Illegal parameter!!" << ::std::endl;
1012 mist::decimal< MAX_KETA > s( 1 );
1013 mist::decimal< MAX_KETA > b = a;
1023 s = ( ( a / s ) + s ) / 2;
1029 static int cmp(
const decimal &a,
const decimal &b )
1037 return( b.sign_ ? -1 : 1 );
1041 return( a.sign_ ? 1 : -1 );
1043 if( a.sign_ == b.sign_ )
1045 int mca = acmp( a, b );
1046 return( a.sign_ ? mca : -mca );
1048 return( a.sign_ ? 1 : -1 );
1051 static int acmp(
const decimal &a,
const decimal &b )
1055 return( b.zero_ ? 0 : -1 );
1062 difference_type ia, ib;
1063 difference_type aexp = a.exp_;
1064 difference_type bexp = b.exp_;
1066 for( ia = 0 ; ia <= NMPA && aexp != MINEXP ; ia++ )
1068 if( a.data_[ ia ] != 0 )
1074 for( ib = 0 ; ib <= NMPA && bexp != MINEXP ; ib++ )
1076 if( b.data_[ ib ] != 0 )
1085 return( aexp > bexp ? 1: -1 );
1087 for( difference_type i = ia ; i <= NMPA ; i++ )
1089 if( a.data_[ i ] != b.data_[ i ] )
1091 return( a.data_[ i ] > b.data_[ i ] ? 1 : -1 );
1097 static difference_type aprs(
const decimal &a, decimal &b )
1099 if( acmp( a, b ) < 0 )
1101 ::std::cerr <<
"Error : |a| < |b| " << ::std::endl;
1104 difference_type n = a.exp_ - b.exp_;
1114 difference_type r = b.data_[ NMPA - n + 1 ], i;
1116 for( i = NMPA ; i >= n ; i-- )
1118 b.data_[ i ] = b.data_[ i - n ];
1120 for( ; i >= 0 ; i-- )
1127 static void aadd( decimal &a, decimal b )
1134 bool sign = a.sign_;
1144 int cmp = acmp( a, b );
1152 difference_type i = aprs( a, b );
1163 for( i = NMPA ; i >= 0 ; i-- )
1165 u += ( a.data_[ i ] + b.data_[ i ] );
1166 a.data_[ i ] =
static_cast< value_type
>( u & RADIX1 );
1174 if( a.exp_ == MAXEXP )
1176 ::std::cerr <<
"Error : Overflow!!" << ::std::endl;
1180 difference_type k = a.data_[ NMPA ];
1181 for( i = NMPA ; i > 0 ; i-- )
1183 a.data_[ i ] = a.data_[ i - 1 ];
1185 a.data_[ i ] =
static_cast< value_type
>( u );
1189 for( i = NMPA ; ++( a.data_[ i ] ) & RADIX ; i-- )
1191 a.data_[ i ] &= RADIX1;
1197 static void asub( decimal &a, decimal b )
1199 difference_type i = aprs( a, b );
1205 bool sign = a.sign_;
1206 difference_type u = 0, n, m;
1212 for( i = NMPA ; i >= 0 ; i-- )
1214 u = a.data_[ i ] - b.data_[ i ] - u;
1215 a.data_[ i ] =
static_cast< value_type
>( u & RADIX1 );
1216 u = ( u >> RADIXBITS ) & 1;
1218 for( n = 0 ; n <= NMPA ; n++ )
1230 if( a.exp_ > MAXEXP - n )
1232 m = MAXEXP - a.exp_;
1238 for( i = 0 ; i <= NMPA - m; i++ )
1240 a.data_[ i ] = a.data_[ n + i ];
1242 for( i = 1 ; i <= m ; i++ )
1244 a.data_[ NMPA - m + i ] = 0;
1250 static decimal read( const ::std::string &str )
1252 ::std::string::const_iterator p = str.begin( );
1260 else if( *p ==
'+' )
1270 int pflag = 0, zflag = 0;
1271 for( ; p != str.end( ) ; p++ )
1277 ::std::cerr <<
"Error : Illegal parameter!!" << ::std::endl;
1282 else if( *p ==
'E' || *p ==
'e' )
1286 exp -= atoi( ::std::string( p, str.end( ) ).c_str( ) );
1289 else if( *p ==
'+' || *p ==
'-' )
1291 exp -= atoi( ::std::string( p, str.end( ) ).c_str( ) );
1294 else if( *p !=
' ' && ( *p < '0' || *p >
'9' ) )
1296 ::std::cerr <<
"Error : Illegal parameter!!" << ::std::endl;
1302 if( c != 0 || pflag != 0 )
1312 else if( zflag == 1 )
1314 ::std::cerr <<
"Error : Illegal parameter!!" << ::std::endl;
1334 ::std::cerr <<
"Error : Overflow!!" << ::std::endl;
1335 return( maximum( ) );
1339 ::std::cerr <<
"Error : Underflow!!" << ::std::endl;
1369 template <
unsigned int MAX_KETA >
inline const decimal< MAX_KETA >
operator +(
const decimal< MAX_KETA > &v1,
const decimal< MAX_KETA > &v2 ){
return( decimal< MAX_KETA >( v1 ) += v2 ); }
1370 template <
unsigned int MAX_KETA >
inline const decimal< MAX_KETA >
operator -(
const decimal< MAX_KETA > &v1,
const decimal< MAX_KETA > &v2 ){
return( decimal< MAX_KETA >( v1 ) -= v2 ); }
1371 template <
unsigned int MAX_KETA >
inline const decimal< MAX_KETA >
operator *(
const decimal< MAX_KETA > &v1,
const decimal< MAX_KETA > &v2 ){
return( decimal< MAX_KETA >( v1 ) *= v2 ); }
1372 template <
unsigned int MAX_KETA >
inline const decimal< MAX_KETA >
operator /(
const decimal< MAX_KETA > &v1,
const decimal< MAX_KETA > &v2 ){
return( decimal< MAX_KETA >( v1 ) /= v2 ); }
1374 template <
unsigned int MAX_KETA >
inline const decimal< MAX_KETA >
operator *(
const decimal< MAX_KETA > &v1,
const typename decimal< MAX_KETA >::difference_type &v2 ){
return( decimal< MAX_KETA >( v1 ) *= v2 ); }
1375 template <
unsigned int MAX_KETA >
inline const decimal< MAX_KETA >
operator *(
const typename decimal< MAX_KETA >::difference_type &v1,
const decimal< MAX_KETA > &v2 ){
return( decimal< MAX_KETA >( v2 ) *= v1 ); }
1376 template <
unsigned int MAX_KETA >
inline const decimal< MAX_KETA >
operator /(
const decimal< MAX_KETA > &v1,
const typename decimal< MAX_KETA >::difference_type &v2 ){
return( decimal< MAX_KETA >( v1 ) /= v2 ); }
1377 template <
unsigned int MAX_KETA >
inline const decimal< MAX_KETA >
operator /(
const typename decimal< MAX_KETA >::difference_type &v1,
const decimal< MAX_KETA > &v2 ){
return( decimal< MAX_KETA >( v1 ) /= v2 ); }
1379 template <
unsigned int MAX_KETA >
inline const decimal< MAX_KETA >
operator +(
const decimal< MAX_KETA > &v1,
const typename decimal< MAX_KETA >::difference_type &v2 ){
return( decimal< MAX_KETA >( v1 ) += v2 ); }
1380 template <
unsigned int MAX_KETA >
inline const decimal< MAX_KETA >
operator +(
const typename decimal< MAX_KETA >::difference_type &v1,
const decimal< MAX_KETA > &v2 ){
return( decimal< MAX_KETA >( v2 ) += v1 ); }
1381 template <
unsigned int MAX_KETA >
inline const decimal< MAX_KETA >
operator -(
const decimal< MAX_KETA > &v1,
const typename decimal< MAX_KETA >::difference_type &v2 ){
return( decimal< MAX_KETA >( v1 ) -= v2 ); }
1382 template <
unsigned int MAX_KETA >
inline const decimal< MAX_KETA >
operator -(
const typename decimal< MAX_KETA >::difference_type &v1,
const decimal< MAX_KETA > &v2 ){
return( decimal< MAX_KETA >( v1 ) -= v2 ); }
1385 template <
unsigned int MAX_KETA >
inline const decimal< MAX_KETA >
operator *(
const decimal< MAX_KETA > &v1,
const double &v2 ){
return( decimal< MAX_KETA >( v2 ) *= v1 ); }
1386 template <
unsigned int MAX_KETA >
inline const decimal< MAX_KETA >
operator *(
const double &v1,
const decimal< MAX_KETA > &v2 ){
return( decimal< MAX_KETA >( v1 ) *= v2 ); }
1387 template <
unsigned int MAX_KETA >
inline const decimal< MAX_KETA >
operator /(
const decimal< MAX_KETA > &v1,
const double &v2 ){
return( decimal< MAX_KETA >( v1 ) /= decimal< MAX_KETA >( v2 ) ); }
1388 template <
unsigned int MAX_KETA >
inline const decimal< MAX_KETA >
operator /(
const double &v1,
const decimal< MAX_KETA > &v2 ){
return( decimal< MAX_KETA >( v1 ) /= v2 ); }
1390 template <
unsigned int MAX_KETA >
inline const decimal< MAX_KETA >
operator +(
const decimal< MAX_KETA > &v1,
const double &v2 ){
return( decimal< MAX_KETA >( v2 ) += v1 ); }
1391 template <
unsigned int MAX_KETA >
inline const decimal< MAX_KETA >
operator +(
const double &v1,
const decimal< MAX_KETA > &v2 ){
return( decimal< MAX_KETA >( v1 ) += v2 ); }
1392 template <
unsigned int MAX_KETA >
inline const decimal< MAX_KETA >
operator -(
const decimal< MAX_KETA > &v1,
const double &v2 ){
return( decimal< MAX_KETA >( v1 ) -= decimal< MAX_KETA >( v2 ) ); }
1393 template <
unsigned int MAX_KETA >
inline const decimal< MAX_KETA >
operator -(
const double &v1,
const decimal< MAX_KETA > &v2 ){
return( decimal< MAX_KETA >( v1 ) -= v2 ); }
1396 template <
unsigned int MAX_KETA >
1397 inline std::ostream &operator <<( std::ostream &out, const decimal< MAX_KETA > &a )
1399 out << a.to_string( );
1409 template <
unsigned int MAX_KETA >
1410 inline mist::decimal< MAX_KETA > sqrt(
const mist::decimal< MAX_KETA > &a )
1412 return( mist::decimal< MAX_KETA >::sqrt( a ) );
1418 #endif // __INCLUDE_MIST_DECIMAL_H__