// ============================================================ // // compare.cpp // // Copyright 2002, Dennis Meilicke and Rene Peralta // // ============================================================ // // Description: // // Functions for comparing two numbers. // // ============================================================ #include #include compare_t AbsCompare( const Base * const A, const Base * const B ) // // Returns: // greaterThan if Abs(A) > Abs(B) // lessThan if Abs(A) < Abs(B) // equalTo if Abs(A) == Abs(B) // { if( A->size > B->size ) return greaterThan; if( A->size < B->size ) return lessThan; const digit_t *a = A->digit + A->size - 1; const digit_t *b = B->digit + B->size - 1; for( ; a>=A->digit ; a--, b-- ) { if( *a > *b ) return greaterThan; if( *a < *b ) return lessThan; } return equalTo; } // ============================================================ // compare_t Compare( const Base * const A, const Base * const B ) // // Returns: // greaterThan if A > B // lessThan if A < B // equalTo if A == B // { if( A->size == 0 ) return ( B->size == 0 ) ? equalTo : ( B->sign == negative ) ? greaterThan : lessThan; if( B->size == 0 ) return ( A->sign == negative ) ? lessThan : greaterThan; if( A->sign == B->sign ) if( A->sign == negative ) return (compare_t)( -1 * AbsCompare( A, B ) ); else return AbsCompare( A, B ); else if( A->sign == negative ) return lessThan; else return greaterThan; } // ============================================================ // compare_t Compare( const Base * const A, long b ) // // Returns: // greaterThan if A > b // lessThan if A < b // equalTo if A == b // { if( A->size == 0 ) return ( b == 0 ) ? equalTo : ( b < 0 ) ? greaterThan : lessThan; if( ( A->sign == negative ) == ( b < 0 ) ) if( A->sign == negative ) return (compare_t)( -1 * CompareAbs( A, b ) ); else return CompareAbs( A, b ); else if( A->sign == negative ) return lessThan; else return greaterThan; } // ============================================================ // compare_t CompareAbs( const Base * const A, long b ) // // Returns: // greaterThan if Abs(A) > Abs(b) // lessThan if Abs(A) < Abs(b) // equalTo if Abs(A) == Abs(b) // { if( A->size == 0 ) return ( b == 0 ) ? equalTo : ( b < 0 ) ? greaterThan : lessThan; if( A->size > 1 ) return greaterThan; if( b < 0 ) b = 0 - b; if( A->digit[0] > (unsigned long)b ) return greaterThan; else if( A->digit[0] < (unsigned long)b ) return lessThan; else return equalTo; } // ============================================================ // compare_t CompareAbs( const Base * const A, unsigned long b ) // // Returns: // greaterThan if Abs(A) > Abs(b) // lessThan if Abs(A) < Abs(b) // equalTo if Abs(A) == Abs(b) // { if( A->size == 0 ) return ( b == 0 ) ? equalTo : lessThan; if( A->size > 1 ) return greaterThan; if( A->digit[0] > b ) return greaterThan; else if( A->digit[0] < b ) return lessThan; else return equalTo; } // ============================================================ // compare_t Compare( const Base * const A, unsigned long b ) // // Returns: // greaterThan if A > b // lessThan if A < b // equalTo if A == b // { if( A->size == 0 ) return ( b == 0 ) ? equalTo : lessThan; if( A->sign == negative ) return lessThan; else return CompareAbs( A, b ); }