From 55ef5612f8950bd042ffd6d001908845a4321f8e Mon Sep 17 00:00:00 2001 From: Mike Buland Date: Wed, 17 Apr 2013 21:11:27 -0600 Subject: Now you can multiply fractional numbers. --- src/main.cpp | 1 + src/number.cpp | 26 ++++++++++++++++---------- src/packedintarray.cpp | 2 +- 3 files changed, 18 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/main.cpp b/src/main.cpp index 061ebbb..23388ab 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -285,6 +285,7 @@ void fractest() b = "0.987"; println("%1 + %2 = %3").arg( a ).arg( b ).arg( a + b ); println("%1 - %2 = %3").arg( a ).arg( b ).arg( a - b ); + println("%1 * %2 = %3").arg( a ).arg( b ).arg( a * b ); } int main( int , char *[] ) diff --git a/src/number.cpp b/src/number.cpp index 9fd3865..2d45e7e 100644 --- a/src/number.cpp +++ b/src/number.cpp @@ -52,21 +52,21 @@ Number Number::operator-( const Number &rhs ) const Number Number::operator*( const Number &rhs ) const { - Number ret( iScale, iRadix ); + Number ret( iScale+rhs.iScale,iRadix ); int iCnt = aInt.getSize()+rhs.aInt.getSize(); int iCarry = 0; int iZeros = 0; - for( int j = 0; j < iCnt || iCarry > 0; j++ ) + for( int j = 1-iScale-rhs.iScale; j < iCnt || iCarry > 0; j++ ) { // Bu::println("Pos %1").arg(j); int iPos = iCarry; iCarry = 0; - for( int k = 0; k < rhs.aInt.getSize(); k++ ) + for( int k = 1-rhs.iScale; k < rhs.aInt.getSize(); k++ ) { - if( j-k < 0 ) - break; +// if( j-k < 0 ) +// break; int iRes = digit(j-k)*rhs.digit(k); iPos += iRes; @@ -75,13 +75,19 @@ Number Number::operator*( const Number &rhs ) const // arg( j-k ).arg( digit(j-k) ).arg( k ).arg( rhs.digit(k) ). // arg( iRes ).arg( iPos ).arg( iCarry ); } - if( (iPos%iRadix) == 0 ) - iZeros++; +// Bu::println("=> %1 = %2 (%3 / %4)").arg( j ).arg( iPos ).arg( iPos%iRadix ).arg( iPos/iRadix ); + if( j < 0 ) + ret.aFrac.set( -1-j, (iPos%iRadix) ); else { - for(; iZeros > 0; iZeros-- ) - ret.aInt.append( 0 ); - ret.aInt.append( iPos%iRadix ); + if( (iPos%iRadix) == 0 ) + iZeros++; + else + { + for(; iZeros > 0; iZeros-- ) + ret.aInt.append( 0 ); + ret.aInt.append( iPos%iRadix ); + } } iCarry += iPos/iRadix; } diff --git a/src/packedintarray.cpp b/src/packedintarray.cpp index badc829..d395aa2 100644 --- a/src/packedintarray.cpp +++ b/src/packedintarray.cpp @@ -31,7 +31,7 @@ PackedIntArray::PackedIntArray( PackedIntArray::Unit iBitWidth ) : PackedIntArray::PackedIntArray( PackedIntArray::Unit iBitWidth, int iCount ): iBitWidth( iBitWidth ), aData( NULL ), - iCapacity( bitsizeof(StoreCount(iCount))/iBitWidth ), + iCapacity( (StoreCount(iCount)*StoreBits)/iBitWidth ), iCount( iCount ), uMask( 0 ) { -- cgit v1.2.3