Exercise 2.14. Demonstrate that Lem is right. Investigate the behavior of the system on a variety of arithmetic expressions. Make some intervals A and B, and use them in computing the expressions A/A and A/B. You will get the most insight by using intervals whose width is a small percentage of the center value. Examine the results of the computation in center-percent form (see exercise 2.12).
除法的误差
在 练习 2.13 中,我们得到了乘法的误差将在乘积中叠加。练习 2.14 展示给我们,这样的误差叠加在除法中也是存在的。
这个练习想让我们看到除法的误差情况。见下面的 a 和 b 的结果
(define A (make-center-percent 10 0.01))
(define B (make-center-percent 15 0.05))
(format #t "~%A/A's percent:~a" (percent (div-interval a a)))
; A/A's percent:1.9998000199979854e-2
; or 0.02 <- 0.01 + 0.01
(format #t "~%A/B's percent:~a" (percent (div-interval a b)))
; A/B's percent:.05997001499250375
; or 0.06 <- 0.05 + 0.01
两个代数等价的式子的分析
首先,我们需要看到,在加法中的误差不可以通过叠加得到。两个有误差的值相加得到的值的误差趋近于较小的那个误差。
1 ]=> (percent (add-interval (make-center-percent 10 0.1) (make-center-percent 20 0.01)))
;Value: .03999999999999997
然后,我们通过两个计算电阻的公式计算出结果,发现差别会很大:
(define r1 (make-center-percent 6.8 0.1))
(define r2 (make-center-percent 4.7 0.05))
(let ((result-par1 (par1 r1 r2))
(result-par2 (par2 r1 r2)))
(format #t
"~%par1: ~a[~5a(~5a)]"
result-par1 (center result-par1) (percent result-par1))
(format #t
"~%par2: ~a[~5a(~5a)]"
result-par2 (center result-par2) (percent result-par2)))
;; par1: (2.201031010873943 . 3.4873689182805854)[2.844(.2261)]
;; par2: (2.581558809636278 . 2.97332259363673)[2.777(.0705)]
第二个公式 1 / (1/r1 + 1/r2) 计算结果更精确。
现在可以分析为什么了。我们现在知道,除法结果的误差为误差的叠加,而加法结果的误差趋近于较小那个误差。所以第二个式子
1 / (1/r1 + 1/r2)
的误差与公式 (r1 + r2) 的误差一样。而第一个式子中
r1r2/(r1 + r2)
仅仅分子一项的误差就为 (r1 的误差 + r2 的误差)。