pubanswer

关于区间算术的简要介绍

xixuan2024-06-26

为什么 x^2 不总是等于 x*x

你在公寓里有一面墙和一张沙发。你用尺子测量墙的长度是7英尺,然后测量沙发的长度也是7英尺。沙发能放得下吗?

也许。如果两个测量值都恰好是7英尺,那当然可以,7 ≤ 7。但你可能没有完美地将尺子对齐到沙发上,而且尺子本身可能稍微长了一点。边缘可能存在一定的不确定性,比如1/10英尺。

与其将每个值视为精确的7英尺,我们可以说每个值在6.9英尺到7.1英尺之间。我们可以将其写成区间 (6.9, 7.1)。从这里,我们可以说区间 (a, b) "绝对小于" 另一个区间 (c, d) 如果 b < c,即第一个区间结束于第二个区间开始之前。由于 7.1 !< 6.9,我们不能确定沙发一定能靠墙放下。你的沙发实际上可能是7.1英尺,而墙是6.9英尺,或者沙发是7.05英尺,墙是7.01英尺,等等。

更多算术操作

当将一个区间与一个标量(单个数字)相加/相乘/相减/相除时,我们只需将操作应用于区间的两端。我会使用 Frink,因为它有内置的区间类型。

i[a, b] := new interval [a, b]
i[2, 4] + 2
[4, 6]
i[2, 4] * 2
[4, 8]

对两个区间进行操作则更加复杂。一般原则是“从每个区间中选择一个值,当进行操作时给出最小值,并为最大值做同样的操作”。如果你测量两个长度为3 ± 1英尺,那么它们加在一起的长度必须是6 ± 2英尺。我们可以通过将区间的最小值和最大值相加得到这个结果。

如果我们测量一个矩形的长度为 (5, 7),宽度为 (3, 4),它的面积是多少?乘法看起来像加法一样,只需将两个最小值和两个最大值相乘:

i[5, 7] * i[3, 4]
[15, 28]

但当区间包含负数时,这种方法就会失败。如果我们只相乘最小值和最大值,(-3, 3) * (-3, 3) 会给我们 (9, 9)。但实际上最小值应该从第一个区间中选择 -3,从第二个区间中选择3,这样得到 -9。因此真实的区间是 (-9, 9)。

那么除法呢?它工作方式类似于乘法,但如果除数区间跨越0,则结果未定义。总体而言,区间算术就像常规算术,只是多了更多头疼的问题。

天堂中的麻烦

现在,(-3, 3)² 怎么办?起初我们认为 (-3, 3)² = (-3, 3)(-3, 3),这给了我们相同的区间 (-9, 9)。但这又是错误的。在 (-3, 3)(-3, 3) 中,我们从每个区间中选择一个数并将它们相乘,而在 (-3, 3)^2 中,我们从区间中选择一个数并将其自身相乘。因此实际区间是 (0, 9)。

但是等等,这不意味着 x*x != x^2 吗?是的,它确实意味着。呃,不,它不意味着。也许。这取决于我们对“x”的理解。

两种解释

  1. x 是区间 (-3, 3) 中的某个值,但我们不知道它是什么。因此 x*x 是同一个值两次,所以应该是 (0, 9)。
  2. x 是“散布”在整个区间中的。那么 x*x 可以被视为两个独立的区间,给出 (-9, 9)。

通常人们使用区间表示 [1],但我见过的大多数区间算术系统使用 [2],或者至少是两者的混合,更倾向于 [2]。

有两个原因。首先,你可以在局部推理 [2]。考虑方程 y = sin(x)cos(x),其中 x 是区间 (0, 2π)。计算 y 在 [2] 下很容易:它只是 (-11, 1*1) = (-1, 1)。但在 [1] 下这是不可能的,因为 sin 在 cos 为0时才是 ±1!在 [1] 下实际的区间是 (-0.5, 0.5)。

注意 (-0.5, 0.5) 是 (-1, 1) 的子区间。这是另一个假设 [2] 的原因:结果总是覆盖 [1]。

尽管如此,[2] 导致很多奇怪的行为,比如 x*x != x^2。这被称为过度确定性,并导致过度估计,即你的区间界限太宽,对你来说没有太大用处。Frink 尝试聪明地处理这种情况,有时会重写区间算术以避免过度确定性,即使你希望区间有所不同。

如果我们将相同的值区间分配给不同的变量,那么这些解释对于 (-3, 3) 就没有任何区别了。

x = i[-3, 3]
y = i[-3, 3]
x*y
[-9, 9]

对你的影响

# Python time!
>>> x = 0.3
>>> x + 0.00000000000000001
0.3
>>> x + 0.00000000000000002
0.3
>>> x + 0.00000000000000003
0.30000000000000004

如果一个(双精度)浮点计算落在区间 (0.3 - 3e-17, 0.3 + 3e-17) 内,它会被折叠为值0.3。这导致了一些建议使用区间算术代替浮点数。一个区间可能不如单个浮点数精确,但它会更准确:你不会得到一个确切的数字,但你会知道正确的数字在这个范围内。而一堆浮点计算总会给你一个确切的数字,但它可能离实际答案非常远。

这些建议自浮点数出现以来一直存在。IEEE-754标准之父William Kahan写了一篇文章,解释为什么区间算术不能取代浮点数。他的论点回到过度估计:在大多数计算中,区间边界变得太大而没有用处。

他在2006年写了这篇文章。从那以后,有一个新的大规模区间算术提案:John Gutafson 的通用数字。我认为他的posit版本不是区间,但我不确定?这远远超出了我的专业领域。不过我可以告诉你,Gustafson 和 Kahan 相互厌恶。

这是区间与计算机科学之间的主要联系。当然,还有一些特定领域中区间非常重要,比如制造公差。