#include <guar_exact.h>
Public Methods | |
| GULAPI | rational (void) |
| GULAPI | rational (int na, unsigned long *a, int sign=0) |
| GULAPI | rational (ULong a, int sign=0) |
| GULAPI | rational (int sign, int size_a, int size_b) |
| rational (const rational &other) | |
| GULAPI rational & | operator= (const rational &other) |
| GULAPI | ~rational () |
| GULAPI rational | get_copy () const |
| rational | numerator () const |
| rational | denominator () const |
| GULAPI void | calc_bounds (void) const |
| GULAPI const Interval & | get_bounds (void) const |
| template<class T> GULAPI void | dump (T &num, T &den) const |
| template<class T> void | dump (T &t) const |
| double | dump () const |
| bool | is_zero (void) const |
| int | test (void) const |
| GULAPI void | div_mod (rational *q, rational *r) const |
Public Attributes | |
| rational_rep * | m |
Friends | |
| GULAPI friend rational | operator * (const rational &a, const rational &b) |
| GULAPI friend rational | operator+ (const rational &A, const rational &B) |
| GULAPI friend rational | operator/ (const rational &A, const rational &B) |
| GULAPI friend rational | operator- (const rational &A, const rational &B) |
|
|
Definition at line 470 of file guar_exact.cpp. References GULAPI, m, and gust::PoolAlloc(). Referenced by denominator(), div_mod(), get_copy(), numerator(), rational(), and test().
00471 {
00472 size_t bsize;
00473 void *buf = gust::PoolAlloc( sizeof(rational_rep), &bsize );
00474 if( buf == NULL ) throw gul::PoolAllocError();
00475 m = new(buf) rational_rep;
00476 }
|
|
||||||||||||||||
|
Definition at line 478 of file guar_exact.cpp. References GULAPI, m, and gust::PoolAlloc().
00479 {
00480 size_t bsize;
00481 void *buf = gust::PoolAlloc( sizeof(rational_rep), &bsize );
00482 if( buf == NULL ) throw gul::PoolAllocError();
00483 m = new(buf) rational_rep(sign,na,a);
00484 }
|
|
||||||||||||
|
Definition at line 486 of file guar_exact.cpp. References GULAPI, m, and gust::PoolAlloc().
00487 {
00488 size_t bsize;
00489 void *buf = gust::PoolAlloc( sizeof(rational_rep), &bsize );
00490 if( buf == NULL ) throw gul::PoolAllocError();
00491 m = new(buf) rational_rep(sign,a);
00492 }
|
|
||||||||||||||||
|
Definition at line 494 of file guar_exact.cpp. References GULAPI, m, and gust::PoolAlloc().
00495 {
00496 size_t bsize;
00497 void *buf = gust::PoolAlloc( sizeof(rational_rep), &bsize );
00498 if( buf == NULL ) throw gul::PoolAllocError();
00499 m = new(buf) rational_rep( sign, size_a, size_b );
00500 }
|
|
|
Definition at line 343 of file guar_exact.h. References GULAPI, and rational().
00344 {
00345 other.m->m_refcount++;
00346 m = other.m;
00347 }
|
|
|
Definition at line 517 of file guar_exact.cpp. References GULAPI, m, guar::rational::rational_rep::m_refcount, gust::PoolFree(), and guar::rational::rational_rep::~rational_rep().
00518 {
00519 if( --m->m_refcount == 0 )
00520 {
00521 m->~rational_rep();
00522 gust::PoolFree( m, sizeof(rational_rep) );
00523 }
00524 }
|
|
|
Definition at line 540 of file guar_exact.cpp. References guar::rational::rational_rep::calc_bounds(), GULAPI, and m.
00541 {
00542 m->calc_bounds();
00543 }
|
|
|
Definition at line 361 of file guar_exact.h. References GULAPI, and rational().
|
|
||||||||||||
|
Definition at line 794 of file guar_exact.cpp. References GULAPI, guar::IntDiv(), m, guar::rational::rational_rep::m_a, guar::rational::rational_rep::m_b, guar::rational::rational_rep::m_na, guar::rational::rational_rep::m_nb, guar::rational::rational_rep::m_sign, and rational().
00795 {
00796 if( (m->m_na == 0) || (m->m_nb == 0) )
00797 {
00798 *q = *this;
00799 *r = rational();
00800 return;
00801 }
00802 else if( m->m_na < m->m_nb )
00803 {
00804 *q = rational();
00805 *r = rational( 0, m->m_na, 0 );
00806 memcpy( r->m->m_a, m->m_a, m->m_na*sizeof(unsigned long) );
00807 }
00808 else
00809 {
00810 rational Q( 0, m->m_na - m->m_nb + 1, 0 );
00811 rational R( 0, m->m_nb, 0 );
00812
00813 if( !IntDiv( m->m_na, m->m_a, m->m_nb, m->m_b,
00814 &Q.m->m_na, Q.m->m_a, &R.m->m_na, R.m->m_a ) )
00815 throw gul::Error();
00816
00817 *q = Q; *r = R;
00818 }
00819
00820 if( m->m_sign )
00821 {
00822 *q = *q + rational(ULong(1));
00823 q->m->m_sign = -1;
00824
00825 rational h( 0, m->m_nb, 0 );
00826 memcpy( h.m->m_a, m->m_b, m->m_nb*sizeof(unsigned long) );
00827 *r = h - *r;
00828 }
00829 }
|
|
|
Definition at line 382 of file guar_exact.h.
00383 {
00384 double t;
00385 dump(t);
00386 return t;
00387 }
|
|
||||||||||
|
Definition at line 374 of file guar_exact.h.
|
|
||||||||||||||||
|
Definition at line 552 of file guar_exact.cpp. References guar::rational::rational_rep::dump(), GULAPI, and m.
|
|
|
Definition at line 545 of file guar_exact.cpp. References guar::rational::rational_rep::calc_bounds(), GULAPI, m, guar::rational::rational_rep::m_bounds, and guar::rational::rational_rep::m_i.
|
|
|
Definition at line 526 of file guar_exact.cpp. References GULAPI, m, guar::rational::rational_rep::m_a, guar::rational::rational_rep::m_b, guar::rational::rational_rep::m_na, guar::rational::rational_rep::m_nb, guar::rational::rational_rep::m_sign, and rational().
|
|
|
Definition at line 389 of file guar_exact.h.
|
|
|
Definition at line 354 of file guar_exact.h. References rational().
|
|
|
Definition at line 502 of file guar_exact.cpp. References GULAPI, m, guar::rational::rational_rep::m_refcount, gust::PoolFree(), and guar::rational::rational_rep::~rational_rep().
00503 {
00504 other.m->m_refcount++;
00505
00506 if( --m->m_refcount == 0 )
00507 {
00508 m->~rational_rep();
00509 gust::PoolFree( m, sizeof(rational_rep) );
00510 }
00511
00512 m = other.m;
00513
00514 return( *this );
00515 }
|
|
|
Definition at line 391 of file guar_exact.h. References GULAPI, and rational().
|
|
||||||||||||
|
Definition at line 580 of file guar_exact.cpp.
00581 {
00582 if( (a.m->m_na == 0) || (b.m->m_na == 0) ) /* a = 0 or b = 0 */
00583 {
00584 rational c;
00585 return(c);
00586 }
00587 else
00588 {
00589 rational c( a.m->m_sign ^ b.m->m_sign,
00590 a.m->m_na + b.m->m_na, a.m->m_nb + b.m->m_nb );
00591
00592 IntMult( a.m->m_na, a.m->m_a, b.m->m_na, b.m->m_a,
00593 &c.m->m_na, c.m->m_a );
00594
00595 if( (a.m->m_nb != 0) && (b.m->m_nb != 0) )
00596 {
00597 IntMult( a.m->m_nb, a.m->m_b, b.m->m_nb, b.m->m_b,
00598 &c.m->m_nb, c.m->m_b );
00599 }
00600 else
00601 {
00602 if( b.m->m_nb != 0 )
00603 {
00604 memcpy( c.m->m_b, b.m->m_b, b.m->m_nb*sizeof(unsigned long) );
00605 c.m->m_nb = b.m->m_nb;
00606 }
00607 else if( a.m->m_nb != 0 )
00608 {
00609 memcpy( c.m->m_b, a.m->m_b, a.m->m_nb*sizeof(unsigned long) );
00610 c.m->m_nb = a.m->m_nb;
00611 }
00612 }
00613
00614 return(c);
00615 }
00616 }
|
|
||||||||||||
|
Definition at line 618 of file guar_exact.cpp.
00619 {
00620 unsigned long *a1b2,*a2b1,*a1b2_a2b1,*b1b2;
00621 unsigned int na1b2,na2b1,n_a1b2_a2b1,nb1b2;
00622 size_t size_a1b2,size_a2b1,size_a1b2_a2b1,size_b1b2;
00623 int sign,sign2;
00624
00625 if( A.m->m_na == 0 ) return(B);
00626 if( B.m->m_na == 0 ) return(A);
00627
00628 rational c;
00629
00630 if( B.m->m_nb == 0 )
00631 {
00632 a1b2 = A.m->m_a;
00633 na1b2 = A.m->m_na;
00634 size_a1b2 = 0;
00635 }
00636 else
00637 {
00638 a1b2 = (unsigned long *)gust::PoolAlloc(
00639 (A.m->m_na+B.m->m_nb)*sizeof(unsigned long), &size_a1b2 );
00640 if( a1b2 == NULL ) throw gul::PoolAllocError();
00641 IntMult( A.m->m_na, A.m->m_a, B.m->m_nb, B.m->m_b,
00642 &na1b2, a1b2 );
00643 }
00644
00645 if( A.m->m_nb == 0 )
00646 {
00647 a2b1 = B.m->m_a;
00648 na2b1 = B.m->m_na;
00649 size_a2b1 = 0;
00650 }
00651 else
00652 {
00653 a2b1 = (unsigned long *)gust::PoolAlloc(
00654 (B.m->m_na+A.m->m_nb)*sizeof(unsigned long), &size_a2b1 );
00655 if( a2b1 == NULL ) throw gul::PoolAllocError();
00656 IntMult( B.m->m_na, B.m->m_a, A.m->m_nb, A.m->m_b,
00657 &na2b1, a2b1 );
00658 }
00659
00660 n_a1b2_a2b1 = na1b2 > na2b1 ? na1b2 : na2b1;
00661 if( n_a1b2_a2b1 == 0 )
00662 {
00663 if( size_a1b2 ) gust::PoolFree( a1b2, size_a1b2 );
00664 if( size_a2b1 ) gust::PoolFree( a2b1, size_a2b1 );
00665 return(c);
00666 }
00667
00668 sign = A.m->m_sign ^ B.m->m_sign;
00669 if( !sign ) n_a1b2_a2b1++;
00670
00671 a1b2_a2b1 = (unsigned long *)gust::PoolAlloc(
00672 n_a1b2_a2b1*sizeof(unsigned long), &size_a1b2_a2b1 );
00673 if( a1b2_a2b1 == NULL ) throw gul::PoolAllocError();
00674
00675 if( sign )
00676 {
00677 sign2 = IntSub( na1b2, a1b2, na2b1, a2b1, &n_a1b2_a2b1, a1b2_a2b1 );
00678 if( n_a1b2_a2b1 == 0 )
00679 {
00680 gust::PoolFree( a1b2_a2b1, size_a1b2_a2b1 );
00681 a1b2_a2b1 = NULL;
00682 }
00683 }
00684 else
00685 {
00686 sign2 = 0;
00687 IntAdd( na1b2, a1b2, na2b1, a2b1, &n_a1b2_a2b1, a1b2_a2b1 );
00688 }
00689
00690 if( size_a1b2 ) gust::PoolFree( a1b2, size_a1b2 );
00691 if( size_a2b1 ) gust::PoolFree( a2b1, size_a2b1 );
00692
00693 if( n_a1b2_a2b1 == 0 ) /* numerator = 0 */
00694 {
00695 sign = 0;
00696 b1b2 = NULL;
00697 nb1b2 = 0;
00698 size_b1b2 = 0;
00699 }
00700 else /* numerator != 0 */
00701 {
00702 if( A.m->m_sign )
00703 sign = sign2 ^ -1;
00704 else
00705 sign = sign2;
00706
00707 if( A.m->m_nb == 0 )
00708 {
00709 if( B.m->m_nb == 0 )
00710 {
00711 b1b2 = NULL;
00712 nb1b2 = 0;
00713 size_b1b2 = 0;
00714 }
00715 else
00716 {
00717 nb1b2 = B.m->m_nb;
00718 b1b2 = (unsigned long *)gust::PoolAlloc(
00719 nb1b2*sizeof(unsigned long), &size_b1b2 );
00720 if( b1b2 == NULL ) throw gul::PoolAllocError();
00721 memcpy( b1b2, B.m->m_b, nb1b2*sizeof(unsigned long) );
00722 }
00723 }
00724 else if( B.m->m_nb == 0 )
00725 {
00726 nb1b2 = A.m->m_nb;
00727 b1b2 = (unsigned long *)gust::PoolAlloc(
00728 nb1b2*sizeof(unsigned long), &size_b1b2 );
00729 if( b1b2 == NULL ) throw gul::PoolAllocError();
00730 memcpy( b1b2, A.m->m_b, nb1b2*sizeof(unsigned long) );
00731 }
00732 else
00733 {
00734 b1b2 = (unsigned long *)gust::PoolAlloc(
00735 (A.m->m_nb+B.m->m_nb)*sizeof(unsigned long), &size_b1b2 );
00736 if( b1b2 == NULL ) throw gul::PoolAllocError();
00737
00738 IntMult( A.m->m_nb, A.m->m_b, B.m->m_nb, B.m->m_b,
00739 &nb1b2, b1b2 );
00740 }
00741 }
00742
00743 c.m->m_sign = sign;
00744 c.m->m_na = n_a1b2_a2b1;
00745 c.m->m_size_a = size_a1b2_a2b1;
00746 c.m->m_a = a1b2_a2b1;
00747 c.m->m_nb = nb1b2;
00748 c.m->m_size_b = size_b1b2;
00749 c.m->m_b = b1b2;
00750 return(c);
00751 }
|
|
||||||||||||
|
Definition at line 767 of file guar_exact.cpp.
00768 {
00769 rational c; // (= 0)
00770
00771 if( A.m == B.m )
00772 return c;
00773
00774 if( A.m->m_na == 0 ) /* if A=0, A+B returns B !!! */
00775 {
00776 if( B.m->m_na != 0 )
00777 {
00778 c = B.get_copy();
00779 c.m->m_sign = B.m->m_sign ^ -1;
00780 }
00781 return c;
00782 }
00783
00784 B.m->negative();
00785 c = A + B;
00786 B.m->negative();
00787
00788 return(c);
00789 }
|
|
||||||||||||
|
Definition at line 753 of file guar_exact.cpp.
|
|
|
Definition at line 336 of file guar_exact.h. Referenced by calc_bounds(), div_mod(), dump(), get_bounds(), get_copy(), operator=(), rational(), and ~rational(). |
1.2.13.1 written by Dimitri van Heesch,
© 1997-2001