diff --git a/Number_types/include/CGAL/MP_Float.h b/Number_types/include/CGAL/MP_Float.h index ee2bca7a564..53d7d00aa94 100644 --- a/Number_types/include/CGAL/MP_Float.h +++ b/Number_types/include/CGAL/MP_Float.h @@ -404,6 +404,14 @@ to_double(const Root_of_2 &r) { const MP_Float &ra = r[2]; const MP_Float &rb = r[1]; + + if(r.is_rational()) { + std::pair n = to_double_exp(rb); + std::pair d = to_double_exp(ra); + double scale = CGAL_CLIB_STD::ldexp(1.0, n.second - d.second); + return (n.first / d.first) * scale; + } + const MP_Float &rc = r[0]; std::pair pa = to_double_exp(ra); @@ -431,6 +439,14 @@ to_interval(const Root_of_2 &r) const MP_Float &ra = r[2]; const MP_Float &rb = r[1]; + + if(r.is_rational()) { + std::pair, int> n = to_interval_exp(rb); + std::pair, int> d = to_interval_exp(ra); + return ldexp(Interval_nt<>(n.first) / Interval_nt<>(d.first), + n.second - d.second).pair(); + } + const MP_Float &rc = r[0]; if(is_zero(rc)) { @@ -440,14 +456,14 @@ to_interval(const Root_of_2 &r) std::pair, int> pb = to_interval_exp(rb); Interval_nt<> a = ldexp(Interval_nt<>(pa.first),pa.second); Interval_nt<> b = ldexp(Interval_nt<>(pb.first),pb.second); - return (CGAL::sqrt(-b/a)).pair(); + return (-b/a).pair(); } if(r.is_smaller()) { std::pair, int> pa = to_interval_exp(ra); std::pair, int> pb = to_interval_exp(rb); Interval_nt<> a = ldexp(Interval_nt<>(pa.first),pa.second); Interval_nt<> b = ldexp(Interval_nt<>(pb.first),pb.second); - return (CGAL::sqrt(-b/a)).pair(); + return (-b/a).pair(); } return std::make_pair(0.0,0.0); }