diff options
author | Mike Buland <mike@xagasoft.com> | 2013-04-19 14:47:40 -0600 |
---|---|---|
committer | Mike Buland <mike@xagasoft.com> | 2013-04-19 14:47:40 -0600 |
commit | 9ad1a65f4dcbc31b031556803d27dc688a16ff4a (patch) | |
tree | aca521bf3ba7e9c777d54d2986eeccecbc18651d /src/number.cpp | |
parent | 85219c48da0d3fff98a9d741e09d34e74abfec0b (diff) | |
download | clic-9ad1a65f4dcbc31b031556803d27dc688a16ff4a.tar.gz clic-9ad1a65f4dcbc31b031556803d27dc688a16ff4a.tar.bz2 clic-9ad1a65f4dcbc31b031556803d27dc688a16ff4a.tar.xz clic-9ad1a65f4dcbc31b031556803d27dc688a16ff4a.zip |
It does fractional division, but the result is an int.
It's funny, I haven't extended division past the ones place yet, but it
does work correctly, so in theory it won't be too hard to do. I may
need a little bit of extra code in the PackedIntArray class to insert a
new digit at the begining.
Diffstat (limited to 'src/number.cpp')
-rw-r--r-- | src/number.cpp | 44 |
1 files changed, 36 insertions, 8 deletions
diff --git a/src/number.cpp b/src/number.cpp index 1c3cb3f..b923d5f 100644 --- a/src/number.cpp +++ b/src/number.cpp | |||
@@ -58,7 +58,7 @@ Number Number::operator*( const Number &rhs ) const | |||
58 | 58 | ||
59 | int iCarry = 0; | 59 | int iCarry = 0; |
60 | int iZeros = 0; | 60 | int iZeros = 0; |
61 | for( int j = 1-iScale-rhs.iScale; j < iCnt || iCarry > 0; j++ ) | 61 | for( int j = -iScale-rhs.iScale; j < iCnt || iCarry > 0; j++ ) |
62 | { | 62 | { |
63 | // Bu::println("Pos %1").arg(j); | 63 | // Bu::println("Pos %1").arg(j); |
64 | int iPos = iCarry; | 64 | int iPos = iCarry; |
@@ -363,7 +363,7 @@ Number Number::add( const Number &rhs, bool bSub ) const | |||
363 | if( bPositive == (bSub?!rhs.bPositive:rhs.bPositive)) | 363 | if( bPositive == (bSub?!rhs.bPositive:rhs.bPositive)) |
364 | { | 364 | { |
365 | ret.bPositive = bPositive; | 365 | ret.bPositive = bPositive; |
366 | for( int j = 1-iScale; j < iPlaces || iCarry > 0; j++ ) | 366 | for( int j = -iScale; j < iPlaces || iCarry > 0; j++ ) |
367 | { | 367 | { |
368 | int iRes = iCarry + digit( j ) + rhs.digit( j ); | 368 | int iRes = iCarry + digit( j ) + rhs.digit( j ); |
369 | // Bu::println(" [%5] Place: %1 + %2 + (%3) = %4"). | 369 | // Bu::println(" [%5] Place: %1 + %2 + (%3) = %4"). |
@@ -396,7 +396,7 @@ Number Number::add( const Number &rhs, bool bSub ) const | |||
396 | ret.bPositive = bPositive; | 396 | ret.bPositive = bPositive; |
397 | int iRes; | 397 | int iRes; |
398 | int iComp = (iRadix-1); | 398 | int iComp = (iRadix-1); |
399 | for( int j = 1-iScale; j < iPlaces; j++ ) | 399 | for( int j = -iScale; j < iPlaces; j++ ) |
400 | { | 400 | { |
401 | iRes = digit( j ) + (iComp-rhs.digit( j )) + iCarry; | 401 | iRes = digit( j ) + (iComp-rhs.digit( j )) + iCarry; |
402 | // Bu::println(" Place: %1 + %2 + (%3) = %4"). | 402 | // Bu::println(" Place: %1 + %2 + (%3) = %4"). |
@@ -441,11 +441,35 @@ Number Number::add( const Number &rhs, bool bSub ) const | |||
441 | 441 | ||
442 | void Number::divide( const Number &rhs, Number &q, Number &r ) const | 442 | void Number::divide( const Number &rhs, Number &q, Number &r ) const |
443 | { | 443 | { |
444 | q.aInt.clear(); | 444 | if( rhs.iScale > 0 ) |
445 | r = *this; | 445 | { |
446 | 446 | Number newrhs = Number( 0, iRadix ); | |
447 | if( rhs.aInt.getSize() > aInt.getSize() ) | 447 | Number newbase = Number( iScale, iRadix ); |
448 | int iOff; | ||
449 | for( iOff = -iScale; iOff < 0 && rhs.digit( iOff ) == 0; iOff++ ) { } | ||
450 | for( int j = iOff; j < rhs.aInt.getSize(); j++ ) | ||
451 | { | ||
452 | newrhs.aInt.append( rhs.digit( j ) ); | ||
453 | newbase.aInt.append( digit( j ) ); | ||
454 | } | ||
455 | for( int j = 0; j < aInt.getSize(); j++ ) | ||
456 | { | ||
457 | newbase.aInt.append( aInt.get( j ) ); | ||
458 | } | ||
459 | for( int j = iScale+iOff; j >= -iOff; j-- ) | ||
460 | { | ||
461 | newbase.aFrac.set( j+iOff, aFrac.get( j ) ); | ||
462 | } | ||
463 | |||
464 | Bu::println("Conv %1 => %2 (iOff = %3)").arg( rhs ).arg( newrhs ).arg( iOff ); | ||
465 | Bu::println("Conv %1 => %2 (iOff = %3)").arg( *this ).arg( newbase ).arg( iOff ); | ||
466 | |||
467 | newbase.divide( newrhs, q, r ); | ||
448 | return; | 468 | return; |
469 | } | ||
470 | |||
471 | q = Number( iScale, iRadix ); | ||
472 | r = *this; | ||
449 | 473 | ||
450 | if( bPositive == rhs.bPositive ) | 474 | if( bPositive == rhs.bPositive ) |
451 | q.bPositive = true; | 475 | q.bPositive = true; |
@@ -481,12 +505,16 @@ void Number::divide( const Number &rhs, Number &q, Number &r ) const | |||
481 | 505 | ||
482 | Number x( rhs.iScale, iRadix ); | 506 | Number x( rhs.iScale, iRadix ); |
483 | int iRes = -1; | 507 | int iRes = -1; |
484 | for( ; x <= sub; iRes++, x = x + rhs ) { } | 508 | Bu::println("{x = %1, sub=%2, rhs=%4, iRes=%3}").arg( x ).arg(sub).arg(iRes).arg(rhs); |
509 | for( ; x <= sub; iRes++, x = x + rhs ) { | ||
510 | Bu::println("{x = %1, sub=%2, rhs=%4, iRes=%3, x+rhs=%5}").arg( x ).arg(sub).arg(iRes).arg(rhs).arg(x+rhs); | ||
511 | } | ||
485 | x = sub - (x - rhs); | 512 | x = sub - (x - rhs); |
486 | if( !x.bPositive ) | 513 | if( !x.bPositive ) |
487 | { | 514 | { |
488 | iSample++; | 515 | iSample++; |
489 | iAnchor--; | 516 | iAnchor--; |
517 | Bu::println("What? it's negative? %1").arg( x ); | ||
490 | continue; | 518 | continue; |
491 | } | 519 | } |
492 | for( int j = 0; iAnchor+j >= 0 && j < x.aInt.getSize(); j++ ) | 520 | for( int j = 0; iAnchor+j >= 0 && j < x.aInt.getSize(); j++ ) |