# Show HN: I made a calculator that works over disjoint sets of intervals

> 来源：HackerNews · [https://victorpoughon.github.io/interval-calculator/](https://victorpoughon.github.io/interval-calculator/)

## 项目/资讯简介

在数学建模和算法开发中，我们经常需要处理分段函数、条件计算或定义域受限的表达式。例如，一个函数在 `x < 0` 时定义为 `x^2`，在 `x >= 0` 时定义为 `sqrt(x)`。传统做法是手动分区间计算，或者编写条件逻辑来逐一处理。但这种方法在面对多个变量、复杂区间组合时，不仅容易出错，而且效率低下。

最近，HackerNews 上出现了一个有趣的项目——**Interval Calculator**，它由开发者 Victor Poughon 创建，旨在解决上述痛点。这个计算器基于**不相交区间集合**（disjoint sets of intervals）的数学概念，允许用户输入包含变量的表达式，并自动计算这些变量在不同区间组合下的结果。简而言之，它像一个“区间版”的数学计算器：你定义变量的可能取值范围（可以是多个不连续的区间），计算器会输出每个区间组合对应的表达式结果。

项目完全开源，并提供了一个直观的 Web 界面（[在线体验](https://victorpoughon.github.io/interval-calculator/)），无需安装即可使用。底层实现则依赖于区间算术（interval arithmetic）和集合运算，确保了计算的准确性和边界覆盖。

## 核心亮点

### 1. 区间集合的“自动展开”能力
传统计算器只能处理单点或连续区间，而 Interval Calculator 的核心创新在于支持**不相交区间集合**。例如，你可以定义变量 `x` 属于 `[-5, -2] ∪ [1, 3]`，变量 `y` 属于 `[0, 2]`，然后输入表达式 `x^2 + y`。计算器会自动枚举所有区间组合（共 2 组），并分别计算每个组合的结果区间。这种“笛卡尔积”式的展开，让开发者无需手动拆分逻辑。

### 2. 可视化结果与边界分析
项目不仅输出最终区间，还以表格形式清晰展示每个子区间的结果。例如，对于上述输入，你会看到：
- 当 `x ∈ [-5, -2]` 且 `y ∈ [0, 2]` 时，`x^2 + y ∈ [4, 27]`
- 当 `x ∈ [1, 3]` 且 `y ∈ [0, 2]` 时，`x^2 + y ∈ [1, 11]`

这种粒度级的结果呈现，让开发者能快速定位极端值或无效区间，尤其适合调试分段函数或验证边界条件。

### 3. 基于区间算术的健壮性
项目底层使用了区间算术库（如 `interval-arithmetic`），确保运算过程中不会丢失边界信息。例如，表达式 `1 / (x - 2)` 在 `x = 2` 处未定义，计算器会自动标记该点无效，并排除相关区间。这种设计避免了浮点数精度问题，也无需手动处理除零等异常。

## 应��场景

### 场景一：分段函数建模与验证
假设你需要实现一个物理模拟，其中阻力系数 `c` 依赖于速度 `v`：
- 当 `v < 10` 时，`c = 0.5`
- 当 `10 ≤ v < 20` 时，`c = 0.8`
- 当 `v ≥ 20` 时，`c = 1.2`

使用 Interval Calculator，你只需定义 `v ∈ [0, 10) ∪ [10, 20) ∪ [20, 100]`，并输入表达式 `c * v^2`。计算器会直接输出每个速度区间的阻力范围，帮你快速验证模型是否合理，而非手工计算每个分段。

### 场景二：参数敏感性分析
在机器学习或金融模型中，经常需要测试输入参数在不同区间下的输出变化。例如，利率 `r` 可能在 `[0.02, 0.05]` 之间波动，而投资期限 `t` 在 `[1, 10]` 年之间。使用 Interval Calculator，你可以定义 `r ∈ [0.02, 0.05]` 和 `t ∈ [1, 10]`，输入公式 `10000 * (1 + r)^t`，即可直接得到最终收益的区间范围。如果 `r` 和 `t` 的取值不连续（如 `r` 只能取 0.02 或 0.05），你还可以用不相交区间集合更精确地建模。

### 场景三：算法边界测试
在开发数值计算库或图形引擎时，需要测试算法对极端输入的稳定性。例如，一个函数 `f(x) = sqrt(x)` 要求 `x ≥ 0`。你可以定义 `x ∈ [-10, -1] ∪ [0, 100]`，然后输入 `sqrt(x)`。计算器会正确返回 `x ∈ [-10, -1]` 部分为无效（NaN），而 `[0, 100]` 部分的结果为 `[0, 10]`。这比手动编写测试用例更高效，尤其当变量维度增加时。

## 总结

Interval Calculator 是一个小而精的工具，它巧妙地将区间算术与集合运算结合，解决了分段计算、条件建模等常见痛点。对于开发者而言，它的价值在于：

1. **减少重复劳动**：自动枚举区间组合，避免手动拆分逻辑。
2. **提升调试效率**：可视化结果让边界问题一目了然。
3. **开源可扩展**：代码托管在 GitHub，你可以根据需求集成到自己的项目中。

当然，它也有局限性：目前仅支持单变量表达式（虽然可以通过组合多个变量实现多变量效果），且对复杂函数（如三角函数）的支持有限。但作为一款专注于“区间集合”的实用工具，它已经足够优秀。如果你经常处理分段函数或参数敏感性分析，不妨试试这个计算器——它可能会成为你工具箱里的一把新钥匙。