41 Interval(
double l,
double h) :
lo(std::min(l,h)),
hi(std::max(l,h)) {}
47 [[nodiscard]]
double mid()
const {
return (
lo +
hi) * 0.5; }
53 [[nodiscard]]
double width()
const {
return hi -
lo; }
60 [[nodiscard]]
bool contains(
double v)
const {
return lo <= v && v <=
hi; }
67 [[nodiscard]]
bool is_exact(
double eps = 1e-12)
const {
return width() < eps; }
97 if (
hi < o.
lo)
return -1;
98 if (
lo > o.
hi)
return 1;
129 return {std::min({a,b,c,d}), std::max({a,b,c,d})};
140 if (o.
lo <= 0 && o.
hi >= 0)
return {-std::numeric_limits<double>::max(),
141 std::numeric_limits<double>::max()};
143 return {std::min({a,b,c,d}), std::max({a,b,c,d})};
159 return {std::sqrt(std::max(0.0,
lo)), std::sqrt(std::max(0.0,
hi))};
170 return {v - error, v + error};
182 double eps = std::abs(v) * 2.22e-16 + 1e-300;
183 return {v - eps, v + eps};
205 return acx * bcy - acy * bcx;
bool contains(double v) const
判断区间是否包含给定值
Interval operator+(const Interval &o) const
区间加法
Interval()
默认构造:空区间 [0, 0]
Interval(double l, double h)
从上下界构造区间
bool is_exact(double eps=1e-12) const
判断区间是否足够窄(收敛)
static Interval from_double(double v, double error=0)
从双精度值创建区间(含舍入误差带)
Interval(double v)
从单值构造精确区间(退化为点)
bool overlaps(const Interval &o) const
判断两个区间是否有重叠
Interval operator*(const Interval &o) const
区间乘法
static Interval from_coord(double v)
从坐标值创建区间(含 ULP 误差带)
Interval operator/(const Interval &o) const
区间除法
Interval operator-() const
取负
int cmp(const Interval &o) const
确定性区间比较
Interval operator-(const Interval &o) const
区间减法
Interval sqrt() const
区间平方根
Interval orient_2d_interval(double ax, double ay, double bx, double by, double cx, double cy)
二维定向行列式的区间验证
int orient_2d_verified(double ax, double ay, double bx, double by, double cx, double cy)
使用区间算术验证 orient_2d 结果