#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(). |