SICP 习题 (2.14)解题总结:区间误差导致的问题

SICP 习题 2.14 的题目要求并没有完全体现在题干中,这道题是和书中前面的内容相关的。


书中讲到,Alyssa做完了我们以前讨论的区间计算模块并发布出去了,然而,一段时间以后她接受到了来自一个叫做Lem的工程师的抱怨,这个叫做Lem的人应该是搞电路的,他用Alyssa的程序去计算两个电阻的并联电阻值,里面就使用了Alyssa设计的区间来表示一个电阻的电阻值。按照物理上的定律,并联电阻的公式是(R1*R2)/ (R1 + R2),或者使用1/(1/R1 + 1/R2),这两个公式不管从数学上来讲还是从物理上来讲都是等价的。不过。。。。如果使用Alyssa的区间进行计算的的话,上面两个公式得出的结果相差很大。


题目要求我们确认Lem是对的,这一点很容易做到,我们按上面的公式拿几个样例做多几个测试就好了,可以确认Lem是对的,Alyssa设计的程序有些问题,导致两个数学上等价的公式计算出不同的结果。


关键问题在于这个程序在哪里出错了?


按照书中的提示,我们计算一下A/A就有些线索了,在数学上,A/A应该等于1,但是,在Alyssa的程序中,A/A并不是等于1,而是等于一个接近1的数值。

其中的关键在于两个区间相除的时候其实是求除数的倒数,然后乘于被除数,我们来看看区间A(100 200),那么A/A就是

=>(100 200) / (100 200)


=>(100 200)  *  (1/100  1/200)


=>(100/200   200/100)


=>(0.5   2)


可以看出,本来相同的两个区间相除,得出的却是一个从0.5到2的区间。


此外,书中还特别提醒我们去留意误差的百分比,比如我们可以看看区间B(1000 1001), B/B就是:


(1000 1001) *  (1/1000  1/1001)


(1000/1001  1001/1000)


(0.999    1.001)


可以看出,这里的结果比较接近1,也就是说,如果误差百分比比较小,区间相除的时候导致的偏差就比较小。


题目的意思大概如此,是让我们去留意复合数据计算过程中可能会出现的问题。



你可能感兴趣的:(Lisp,Scheme,SICP,Lisp进阶)