- // please note that (a<b) == false does not imply (a>=b) == true
- // a false result means the comparison is either false or undecidable
- // (except for !=, where true means unequal or undecidable)
- ex df=lh-rh;
- if (!is_ex_exactly_of_type(df,numeric)) {
- return o==not_equal ? true : false; // cannot decide on non-numerical results
- }
- int cmpval=ex_to_numeric(df).compare(numZERO());
- switch (o) {
- case equal:
- return cmpval==0;
- break;
- case not_equal:
- return cmpval!=0;
- break;
- case less:
- return cmpval<0;
- break;
- case less_or_equal:
- return cmpval<=0;
- break;
- case greater:
- return cmpval>0;
- break;
- case greater_or_equal:
- return cmpval>=0;
- break;
- default:
- throw(std::logic_error("invalid relational operator"));
- }
- return 0;
+ const ex df = lh-rh;
+ if (!is_ex_exactly_of_type(df,numeric))
+ // cannot decide on non-numerical results
+ return o==not_equal ? true : false;
+
+ switch (o) {
+ case equal:
+ return ex_to<numeric>(df).is_zero();
+ case not_equal:
+ return !ex_to<numeric>(df).is_zero();
+ case less:
+ return ex_to<numeric>(df)<_num0();
+ case less_or_equal:
+ return ex_to<numeric>(df)<=_num0();
+ case greater:
+ return ex_to<numeric>(df)>_num0();
+ case greater_or_equal:
+ return ex_to<numeric>(df)>=_num0();
+ default:
+ throw(std::logic_error("invalid relational operator"));
+ }