From 95ace7dc598be3912feb0fa2f5fedb59d9ee0368 Mon Sep 17 00:00:00 2001 From: Mike Buland Date: Thu, 14 Nov 2013 15:36:21 -0700 Subject: Working on new division code. It's not better yet, but it almost works. --- src/main.cpp | 8 ++++++++ src/number.cpp | 31 +++++++++++++++++-------------- src/unitnumber.cpp | 6 +++++- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index cd38438..50b143e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -11,10 +11,18 @@ #include using namespace Bu; +#define mathTestP( sc, anum, op, bnum, answ ) \ + Bu::println(">>%1<<").arg((Number(anum, sc) op Number(bnum, sc)).toString()) + int main( int argc, char *argv[] ) { try { + mathTestP( 5, "63.6", /, "504", "0.12619" ); + mathTestP( 5, "63.61", /, "504", "0.12621" ); + mathTestP( 7, "63.610123", /, "5041", "0.12621" ); + mathTestP( 7, "63.610123", /, "50412", "0.12621" ); +// return 0; Options opt( argc, argv ); println("CliC - 0.08"); diff --git a/src/number.cpp b/src/number.cpp index 1b0efdc..b4cfaf2 100644 --- a/src/number.cpp +++ b/src/number.cpp @@ -404,7 +404,6 @@ void Number::divide( const Number &rhs, Number &q, Number &r ) const newbase.aFrac.set( j+iOff, aFrac.get( j ) ); } -// Bu::println("Conv %1 => %2 (iOff = %3)").arg( rhs ).arg( newrhs ).arg( iOff ); // Bu::println("Conv %1 => %2 (iOff = %3)").arg( *this ).arg( newbase ).arg( iOff ); newbase.divide( newrhs, q, r ); @@ -424,15 +423,11 @@ void Number::divide( const Number &rhs, Number &q, Number &r ) const int iAnchor = r.aInt.getSize()-iMinWidth; int iSample = iMinWidth; + int iAnchorOffset = 0; do { // Bu::println("%1\n-----").arg( r.aInt.toString() ); Number sub( 0, iRadix ); - if( iAnchor < 0 ) - { - sub = r; - sub.aInt.insert(0,0); - } for(;;) { // Bu::println(" -> Anchor: %1, Sample: %2").arg( iAnchor ).arg( iSample ); @@ -442,12 +437,19 @@ void Number::divide( const Number &rhs, Number &q, Number &r ) const } else { -/* sub.aInt.clear(); - for( int j = iAnchor; j < r.aInt.getSize(); j++ ) + int iMyAnchor = iAnchor-iAnchorOffset; +// Bu::println(" -> starting with: %1").arg( r ); + if( iSample+iMyAnchor > 0 ) + { + sub.aInt.set( r.aInt, 0, iSample+iMyAnchor ); + for( int j = 0; j < iSample-(iSample+iMyAnchor); j++ ) + sub.aInt.insert(0, r.aFrac[j]); + } + else { - sub.aInt.append( r.digit( j ) ); + for( int j = 0; j < iSample; j++ ) + sub.aInt.insert(0, r.aFrac[j-(iMyAnchor+iSample)]); } - */ } // Bu::println("%1\n%2\n----").arg( sub.toString() ).arg( rhs.toString() ); if( sub < rhs ) @@ -461,13 +463,14 @@ void Number::divide( const Number &rhs, Number &q, Number &r ) const // Bu::println("[Inner exit] Complete: q = %1, r = %2").arg( q.toString() ).arg( r.toString() ); return; } - sub.aInt.insert(0, 0); } } else break; } + iAnchorOffset = iAnchor; + Number x( 0, iRadix ); int iRes = -1; // Bu::println("{x = %1, sub=%2, rhs=%4, iRes=%3}").arg( x ).arg(sub).arg(iRes).arg(rhs); @@ -506,10 +509,10 @@ void Number::divide( const Number &rhs, Number &q, Number &r ) const q.aFrac.set( -1-iAnchor, iRes ); iSample = iMinWidth; - if( iAnchor > 0 ) +// if( iAnchor > 0 ) iAnchor -= rhs.aInt.getSize()-x.aInt.getSize(); - else - iAnchor--; +// else +// iAnchor--; // iAnchor = r.aInt.getSize()-iMinWidth; // Bu::println(" -> new Anchor: %1, Sample: %2").arg( iAnchor ). // arg( iSample ); diff --git a/src/unitnumber.cpp b/src/unitnumber.cpp index 92cf1b7..fc56bf6 100644 --- a/src/unitnumber.cpp +++ b/src/unitnumber.cpp @@ -252,6 +252,8 @@ void UnitNumber::radix1() #define mathTestS( sc, anum, op, bnum, answ ) \ unitTest( (Number(anum, sc) op Number(bnum, sc)).toString() == answ ) +#define mathTestP( sc, anum, op, bnum, answ ) \ + Bu::println(">>%1<<").arg((Number(anum, sc) op Number(bnum, sc)).toString()) void UnitNumber::fraction1() { @@ -261,7 +263,9 @@ void UnitNumber::fraction1() mathTestS( 8, "123.456", -, "0.987", "122.469" ); mathTestS( 8, "123.456", *, "0.987", "121.851072" ); mathTestS( 8, "123.456", /, "0.987", "125.08206686" ); - + + mathTestP( 5, "63.6", /, "504", "0.12619" ); + mathTestS( 5, "63.6", /, "504", "0.12619" ); mathTestS( 8, "12", /, "4", "3" ); mathTestS( 100, "9", /, "1.9", "4.7368421052631578947368421052631578947368421052631578947368421052631578947368421052631578947368421052" ); } -- cgit v1.2.3