From 439c5a36138a66b0c76ec3136c79a86ca3619f17 Mon Sep 17 00:00:00 2001 From: Mike Buland Date: Tue, 16 Apr 2013 15:35:36 -0600 Subject: Broke the string parser. --- src/main.cpp | 15 ++++++++++++--- src/number.cpp | 45 ++++++++++++++++++++++++++++----------------- src/number.h | 5 +++-- 3 files changed, 43 insertions(+), 22 deletions(-) (limited to 'src') diff --git a/src/main.cpp b/src/main.cpp index 4454c08..0e5a77d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -259,7 +259,7 @@ void ordertest() void radixtest() { - Number a( 16 ), b( 16 ); + Number a( 0, 16 ), b( 0, 16 ); a = "f8a72bce3"; b = "9ea8cb3"; @@ -276,6 +276,15 @@ void radixtest() println("%1 * %2 = %3").arg( a ).arg( b ).arg( (a * b) ); } +void fractest() +{ + Number a( 8 ), b( 8 ); + + a = "123.456"; + b = "0.987"; + println("%1 + %2 = %3").arg( a ).arg( b ).arg( a + b ); +} + int main( int , char *[] ) { println("CliC"); @@ -283,8 +292,8 @@ int main( int , char *[] ) // packedtest1(); // numbertest1(); // numbertestcomp(); - radixtest(); - +// radixtest(); + fractest(); // ordertest(); return 0; diff --git a/src/number.cpp b/src/number.cpp index 5ef8009..c7a4cc6 100644 --- a/src/number.cpp +++ b/src/number.cpp @@ -5,19 +5,21 @@ #define RadixToBits( x ) ((int)(log((x))*0xb.8aa3b295c17fp-3+1.0)) -Number::Number( int iRadix, int iScale ) : +Number::Number( int iScale, int iRadix ) : iRadix( iRadix ), iScale( iScale ), bPositive( true ), - aInt( RadixToBits(iRadix) ) + aInt( RadixToBits(iRadix) ), + aFrac( RadixToBits(iRadix), iScale ) { } -Number::Number( const Bu::String &sData, int iRadix, int iScale ) : +Number::Number( const Bu::String &sData, int iScale, int iRadix ) : iRadix( iRadix ), iScale( iScale ), bPositive( true ), - aInt( RadixToBits( iRadix ) ) + aInt( RadixToBits( iRadix ) ), + aFrac( RadixToBits(iRadix), iScale ) { set( sData ); } @@ -50,7 +52,7 @@ Number Number::operator-( const Number &rhs ) const Number Number::operator*( const Number &rhs ) const { - Number ret( iRadix, iScale ); + Number ret( iScale, iRadix ); int iCnt = aInt.getSize()+rhs.aInt.getSize(); @@ -94,14 +96,14 @@ Number Number::operator*( const Number &rhs ) const Number Number::operator/( const Number &rhs ) const { - Number q( iRadix, iScale ), r( iRadix, iScale ); + Number q( iScale, iRadix ), r( iScale, iRadix ); divide( rhs, q, r ); return q; } Number Number::operator%( const Number &rhs ) const { - Number q( iRadix, iScale ), r( iRadix, iScale ); + Number q( iScale, iRadix ), r( iScale, iRadix ); divide( rhs, q, r ); return r; } @@ -238,20 +240,29 @@ void Number::set( const Bu::String &sNum ) { aInt.clear(); bPositive = true; - for( int j = sNum.getSize()-1; j >= 0; j-- ) + int j = sNum.getSize()-1; + + if( sNum[j] == '+' ) + j--; + else if( sNum[j] == '-' ) { - if( sNum[j] == '+' ) - break; - if( sNum[j] == '-' ) - { - bPositive = false; + bPositive = false; + j--; + } + for( ; sNum[j] == '0' && j >= 0; j-- ) { } + + for( ; j >= 0; j-- ) + { + Bu::println(" -> '%1'").arg( sNum[j] ); + if( sNum[j] == '.' ) break; - } if( sNum[j] >= '0' && sNum[j] <= '9' ) aInt.append( sNum[j]-'0' ); else aInt.append( sNum[j]-'a'+10 ); } + + Bu::println("done."); } void Number::set( const Number &sNum ) @@ -289,7 +300,7 @@ int Number::digit( int iIdx ) const Number Number::add( const Number &rhs, bool bSub ) const { - Number ret( iRadix, iScale ); + Number ret( iScale, iRadix ); int iPlaces = Bu::buMax(rhs.aInt.getSize(), aInt.getSize() ); @@ -386,7 +397,7 @@ void Number::divide( const Number &rhs, Number &q, Number &r ) const do { // Bu::println("%1\n-----").arg( r.aInt.toString() ); - Number sub( iRadix, iScale ); + Number sub( iScale, iRadix ); for(;;) { // Bu::println(" -> Anchor: %1, Sample: %2").arg( iAnchor ).arg( iSample ); @@ -406,7 +417,7 @@ void Number::divide( const Number &rhs, Number &q, Number &r ) const break; } - Number x( iRadix, iScale ); + Number x( iScale, iRadix ); int iRes = 0; for( ; x <= sub; iRes++, x = x + rhs ) { } x = sub - (x - rhs); diff --git a/src/number.h b/src/number.h index deac5eb..c16dd55 100644 --- a/src/number.h +++ b/src/number.h @@ -7,8 +7,8 @@ class Number { public: - Number( int iRadix=10, int iScale=0 ); - Number( const Bu::String &sData, int iRadix=10, int iScale=0 ); + Number( int iScale=0, int iRadix=10 ); + Number( const Bu::String &sData, int iScale=0, int iRadix=10 ); virtual ~Number(); Number &operator=( const Bu::String &sNum ); @@ -50,6 +50,7 @@ private: int iScale; bool bPositive; PackedIntArray aInt; + PackedIntArray aFrac; }; Bu::Formatter &operator<<( Bu::Formatter &f, const Number &n ); -- cgit v1.2.3