mirror of https://github.com/CGAL/cgal
fixing bug on to_interval when rc is zero
This commit is contained in:
parent
309c1dc5ad
commit
07f56c182e
|
|
@ -404,6 +404,14 @@ to_double(const Root_of_2<MP_Float> &r)
|
|||
{
|
||||
const MP_Float &ra = r[2];
|
||||
const MP_Float &rb = r[1];
|
||||
|
||||
if(r.is_rational()) {
|
||||
std::pair<double, int> n = to_double_exp(rb);
|
||||
std::pair<double, int> 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<double, int> pa = to_double_exp(ra);
|
||||
|
|
@ -431,6 +439,14 @@ to_interval(const Root_of_2<MP_Float> &r)
|
|||
|
||||
const MP_Float &ra = r[2];
|
||||
const MP_Float &rb = r[1];
|
||||
|
||||
if(r.is_rational()) {
|
||||
std::pair<std::pair<double, double>, int> n = to_interval_exp(rb);
|
||||
std::pair<std::pair<double, double>, 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<MP_Float> &r)
|
|||
std::pair<std::pair<double, double>, 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<std::pair<double, double>, int> pa = to_interval_exp(ra);
|
||||
std::pair<std::pair<double, double>, 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);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue