diff options
Diffstat (limited to '')
-rw-r--r-- | src/main.cpp | 15 | ||||
-rw-r--r-- | src/number.cpp | 45 | ||||
-rw-r--r-- | src/number.h | 5 |
3 files changed, 43 insertions, 22 deletions
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() | |||
259 | 259 | ||
260 | void radixtest() | 260 | void radixtest() |
261 | { | 261 | { |
262 | Number a( 16 ), b( 16 ); | 262 | Number a( 0, 16 ), b( 0, 16 ); |
263 | 263 | ||
264 | a = "f8a72bce3"; | 264 | a = "f8a72bce3"; |
265 | b = "9ea8cb3"; | 265 | b = "9ea8cb3"; |
@@ -276,6 +276,15 @@ void radixtest() | |||
276 | println("%1 * %2 = %3").arg( a ).arg( b ).arg( (a * b) ); | 276 | println("%1 * %2 = %3").arg( a ).arg( b ).arg( (a * b) ); |
277 | } | 277 | } |
278 | 278 | ||
279 | void fractest() | ||
280 | { | ||
281 | Number a( 8 ), b( 8 ); | ||
282 | |||
283 | a = "123.456"; | ||
284 | b = "0.987"; | ||
285 | println("%1 + %2 = %3").arg( a ).arg( b ).arg( a + b ); | ||
286 | } | ||
287 | |||
279 | int main( int , char *[] ) | 288 | int main( int , char *[] ) |
280 | { | 289 | { |
281 | println("CliC"); | 290 | println("CliC"); |
@@ -283,8 +292,8 @@ int main( int , char *[] ) | |||
283 | // packedtest1(); | 292 | // packedtest1(); |
284 | // numbertest1(); | 293 | // numbertest1(); |
285 | // numbertestcomp(); | 294 | // numbertestcomp(); |
286 | radixtest(); | 295 | // radixtest(); |
287 | 296 | fractest(); | |
288 | // ordertest(); | 297 | // ordertest(); |
289 | 298 | ||
290 | return 0; | 299 | 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 @@ | |||
5 | 5 | ||
6 | #define RadixToBits( x ) ((int)(log((x))*0xb.8aa3b295c17fp-3+1.0)) | 6 | #define RadixToBits( x ) ((int)(log((x))*0xb.8aa3b295c17fp-3+1.0)) |
7 | 7 | ||
8 | Number::Number( int iRadix, int iScale ) : | 8 | Number::Number( int iScale, int iRadix ) : |
9 | iRadix( iRadix ), | 9 | iRadix( iRadix ), |
10 | iScale( iScale ), | 10 | iScale( iScale ), |
11 | bPositive( true ), | 11 | bPositive( true ), |
12 | aInt( RadixToBits(iRadix) ) | 12 | aInt( RadixToBits(iRadix) ), |
13 | aFrac( RadixToBits(iRadix), iScale ) | ||
13 | { | 14 | { |
14 | } | 15 | } |
15 | 16 | ||
16 | Number::Number( const Bu::String &sData, int iRadix, int iScale ) : | 17 | Number::Number( const Bu::String &sData, int iScale, int iRadix ) : |
17 | iRadix( iRadix ), | 18 | iRadix( iRadix ), |
18 | iScale( iScale ), | 19 | iScale( iScale ), |
19 | bPositive( true ), | 20 | bPositive( true ), |
20 | aInt( RadixToBits( iRadix ) ) | 21 | aInt( RadixToBits( iRadix ) ), |
22 | aFrac( RadixToBits(iRadix), iScale ) | ||
21 | { | 23 | { |
22 | set( sData ); | 24 | set( sData ); |
23 | } | 25 | } |
@@ -50,7 +52,7 @@ Number Number::operator-( const Number &rhs ) const | |||
50 | 52 | ||
51 | Number Number::operator*( const Number &rhs ) const | 53 | Number Number::operator*( const Number &rhs ) const |
52 | { | 54 | { |
53 | Number ret( iRadix, iScale ); | 55 | Number ret( iScale, iRadix ); |
54 | 56 | ||
55 | int iCnt = aInt.getSize()+rhs.aInt.getSize(); | 57 | int iCnt = aInt.getSize()+rhs.aInt.getSize(); |
56 | 58 | ||
@@ -94,14 +96,14 @@ Number Number::operator*( const Number &rhs ) const | |||
94 | 96 | ||
95 | Number Number::operator/( const Number &rhs ) const | 97 | Number Number::operator/( const Number &rhs ) const |
96 | { | 98 | { |
97 | Number q( iRadix, iScale ), r( iRadix, iScale ); | 99 | Number q( iScale, iRadix ), r( iScale, iRadix ); |
98 | divide( rhs, q, r ); | 100 | divide( rhs, q, r ); |
99 | return q; | 101 | return q; |
100 | } | 102 | } |
101 | 103 | ||
102 | Number Number::operator%( const Number &rhs ) const | 104 | Number Number::operator%( const Number &rhs ) const |
103 | { | 105 | { |
104 | Number q( iRadix, iScale ), r( iRadix, iScale ); | 106 | Number q( iScale, iRadix ), r( iScale, iRadix ); |
105 | divide( rhs, q, r ); | 107 | divide( rhs, q, r ); |
106 | return r; | 108 | return r; |
107 | } | 109 | } |
@@ -238,20 +240,29 @@ void Number::set( const Bu::String &sNum ) | |||
238 | { | 240 | { |
239 | aInt.clear(); | 241 | aInt.clear(); |
240 | bPositive = true; | 242 | bPositive = true; |
241 | for( int j = sNum.getSize()-1; j >= 0; j-- ) | 243 | int j = sNum.getSize()-1; |
244 | |||
245 | if( sNum[j] == '+' ) | ||
246 | j--; | ||
247 | else if( sNum[j] == '-' ) | ||
242 | { | 248 | { |
243 | if( sNum[j] == '+' ) | 249 | bPositive = false; |
244 | break; | 250 | j--; |
245 | if( sNum[j] == '-' ) | 251 | } |
246 | { | 252 | for( ; sNum[j] == '0' && j >= 0; j-- ) { } |
247 | bPositive = false; | 253 | |
254 | for( ; j >= 0; j-- ) | ||
255 | { | ||
256 | Bu::println(" -> '%1'").arg( sNum[j] ); | ||
257 | if( sNum[j] == '.' ) | ||
248 | break; | 258 | break; |
249 | } | ||
250 | if( sNum[j] >= '0' && sNum[j] <= '9' ) | 259 | if( sNum[j] >= '0' && sNum[j] <= '9' ) |
251 | aInt.append( sNum[j]-'0' ); | 260 | aInt.append( sNum[j]-'0' ); |
252 | else | 261 | else |
253 | aInt.append( sNum[j]-'a'+10 ); | 262 | aInt.append( sNum[j]-'a'+10 ); |
254 | } | 263 | } |
264 | |||
265 | Bu::println("done."); | ||
255 | } | 266 | } |
256 | 267 | ||
257 | void Number::set( const Number &sNum ) | 268 | void Number::set( const Number &sNum ) |
@@ -289,7 +300,7 @@ int Number::digit( int iIdx ) const | |||
289 | 300 | ||
290 | Number Number::add( const Number &rhs, bool bSub ) const | 301 | Number Number::add( const Number &rhs, bool bSub ) const |
291 | { | 302 | { |
292 | Number ret( iRadix, iScale ); | 303 | Number ret( iScale, iRadix ); |
293 | 304 | ||
294 | int iPlaces = Bu::buMax(rhs.aInt.getSize(), aInt.getSize() ); | 305 | int iPlaces = Bu::buMax(rhs.aInt.getSize(), aInt.getSize() ); |
295 | 306 | ||
@@ -386,7 +397,7 @@ void Number::divide( const Number &rhs, Number &q, Number &r ) const | |||
386 | do | 397 | do |
387 | { | 398 | { |
388 | // Bu::println("%1\n-----").arg( r.aInt.toString() ); | 399 | // Bu::println("%1\n-----").arg( r.aInt.toString() ); |
389 | Number sub( iRadix, iScale ); | 400 | Number sub( iScale, iRadix ); |
390 | for(;;) | 401 | for(;;) |
391 | { | 402 | { |
392 | // Bu::println(" -> Anchor: %1, Sample: %2").arg( iAnchor ).arg( iSample ); | 403 | // 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 | |||
406 | break; | 417 | break; |
407 | } | 418 | } |
408 | 419 | ||
409 | Number x( iRadix, iScale ); | 420 | Number x( iScale, iRadix ); |
410 | int iRes = 0; | 421 | int iRes = 0; |
411 | for( ; x <= sub; iRes++, x = x + rhs ) { } | 422 | for( ; x <= sub; iRes++, x = x + rhs ) { } |
412 | x = sub - (x - rhs); | 423 | 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 @@ | |||
7 | class Number | 7 | class Number |
8 | { | 8 | { |
9 | public: | 9 | public: |
10 | Number( int iRadix=10, int iScale=0 ); | 10 | Number( int iScale=0, int iRadix=10 ); |
11 | Number( const Bu::String &sData, int iRadix=10, int iScale=0 ); | 11 | Number( const Bu::String &sData, int iScale=0, int iRadix=10 ); |
12 | virtual ~Number(); | 12 | virtual ~Number(); |
13 | 13 | ||
14 | Number &operator=( const Bu::String &sNum ); | 14 | Number &operator=( const Bu::String &sNum ); |
@@ -50,6 +50,7 @@ private: | |||
50 | int iScale; | 50 | int iScale; |
51 | bool bPositive; | 51 | bool bPositive; |
52 | PackedIntArray aInt; | 52 | PackedIntArray aInt; |
53 | PackedIntArray aFrac; | ||
53 | }; | 54 | }; |
54 | 55 | ||
55 | Bu::Formatter &operator<<( Bu::Formatter &f, const Number &n ); | 56 | Bu::Formatter &operator<<( Bu::Formatter &f, const Number &n ); |