mirror of
				https://github.com/Z3Prover/z3
				synced 2025-11-04 13:29:11 +00:00 
			
		
		
		
	Implement compare
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
		
							parent
							
								
									3ffda25350
								
							
						
					
					
						commit
						ae1da72cb7
					
				
					 2 changed files with 31 additions and 6 deletions
				
			
		| 
						 | 
					@ -825,18 +825,21 @@ namespace realclosure {
 | 
				
			||||||
            SASSERT(is_zero(a));
 | 
					            SASSERT(is_zero(a));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        int sign(numeral const & a) {
 | 
					        int sign(value * a) {
 | 
				
			||||||
            if (is_zero(a))
 | 
					            if (is_zero(a))
 | 
				
			||||||
                return 0;
 | 
					                return 0;
 | 
				
			||||||
            else if (is_nz_rational(a)) {
 | 
					            else if (is_nz_rational(a)) {
 | 
				
			||||||
                return qm().is_pos(to_mpq(a)) ? 1 : -1;
 | 
					                return qm().is_pos(to_mpq(a)) ? 1 : -1;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else {
 | 
					            else {
 | 
				
			||||||
                value * v = a.m_value;
 | 
					                SASSERT(!bqim().contains_zero(a->interval()));
 | 
				
			||||||
                SASSERT(!bqim().contains_zero(v->interval()));
 | 
					                return bqim().is_P(a->interval()) ? 1 : -1;
 | 
				
			||||||
                return bqim().is_P(v->interval()) ? 1 : -1;
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        int sign(numeral const & a) {
 | 
				
			||||||
 | 
					            return sign(a.m_value);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        bool is_int(numeral const & a) {
 | 
					        bool is_int(numeral const & a) {
 | 
				
			||||||
            if (is_zero(a))
 | 
					            if (is_zero(a))
 | 
				
			||||||
| 
						 | 
					@ -1806,9 +1809,29 @@ namespace realclosure {
 | 
				
			||||||
            set(c, div(a.m_value, b.m_value));
 | 
					            set(c, div(a.m_value, b.m_value));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        int compare(value * a, value * b) {
 | 
				
			||||||
 | 
					            if (a == 0)
 | 
				
			||||||
 | 
					                return -sign(b);
 | 
				
			||||||
 | 
					            else if (b == 0)
 | 
				
			||||||
 | 
					                return sign(a);
 | 
				
			||||||
 | 
					            else if (is_nz_rational(a) && is_nz_rational(b))
 | 
				
			||||||
 | 
					                return qm().lt(to_mpq(a), to_mpq(b)) ? -1 : 1;
 | 
				
			||||||
 | 
					            else {
 | 
				
			||||||
 | 
					                // TODO: try to refine interval before switching to sub/expensive approach
 | 
				
			||||||
 | 
					                if (bqm().lt(interval(a).upper(), interval(b).lower()))
 | 
				
			||||||
 | 
					                    return -1;
 | 
				
			||||||
 | 
					                else if (bqm().lt(interval(b).upper(), interval(a).lower()))
 | 
				
			||||||
 | 
					                    return 1;
 | 
				
			||||||
 | 
					                else {
 | 
				
			||||||
 | 
					                    value_ref diff(*this);
 | 
				
			||||||
 | 
					                    diff = sub(a, b);
 | 
				
			||||||
 | 
					                    return sign(diff);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        int compare(numeral const & a, numeral const & b) {
 | 
					        int compare(numeral const & a, numeral const & b) {
 | 
				
			||||||
            // TODO
 | 
					            return compare(a.m_value, b.m_value);
 | 
				
			||||||
            return 0;
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        void select(numeral const & prev, numeral const & next, numeral & result) {
 | 
					        void select(numeral const & prev, numeral const & next, numeral & result) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -50,6 +50,8 @@ static void tst1() {
 | 
				
			||||||
    t = (a - eps*2) / (eps + 1);
 | 
					    t = (a - eps*2) / (eps + 1);
 | 
				
			||||||
    std::cout << t << std::endl;
 | 
					    std::cout << t << std::endl;
 | 
				
			||||||
    std::cout << t * (eps + 1) << std::endl;
 | 
					    std::cout << t * (eps + 1) << std::endl;
 | 
				
			||||||
 | 
					    a = 10;
 | 
				
			||||||
 | 
					    std::cout << (a + eps > a) << std::endl;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void tst_rcf() {
 | 
					void tst_rcf() {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue