diff --git a/Algebraic_foundations/include/CGAL/number_utils.h b/Algebraic_foundations/include/CGAL/number_utils.h index d29434ad603..7195f057cef 100644 --- a/Algebraic_foundations/include/CGAL/number_utils.h +++ b/Algebraic_foundations/include/CGAL/number_utils.h @@ -324,6 +324,36 @@ NT approximate_sqrt(const NT& nt) return approximate_sqrt(nt, Sqrt()); } +template +Comparison_result +compare(const NT& xnum, const NT& xden, + const NT& ynum, const NT& yden) +{ + // No assumptions on the sign of den are made + + // code assumes that SMALLER == - 1; + CGAL_precondition( SMALLER == static_cast(-1) ); + + int xsign = sign(xnum) * sign(xden) ; + int ysign = sign(ynum) * sign(yden) ; + if (xsign == 0) return static_cast(-ysign); + if (ysign == 0) return static_cast(xsign); + // now (x != 0) && (y != 0) + int diff = xsign - ysign; + if (diff == 0) + { + int msign = sign(xden) * sign(yden); + NT leftop = NT(xnum * yden * msign); + NT rightop = NT(ynum * xden * msign); + return compare(leftop, rightop); + } + else + { + return (xsign < ysign) ? SMALLER : LARGER; + } +} + + CGAL_NTS_END_NAMESPACE } //namespace CGAL