SICP

SICP を読んでみる #39 MIT OCW 3A/第二章 p.54

MIT OCW

Lecture 3A | MIT 6.001
本日の MIT ビデオは 2A の後半。

  • cons/car/cdr を使用してリストを作成する方法
  • 上記の糖衣構文、 list
  • map

list や map は本ではまだ出てきていないのでここで初お目見え。
やってることはわかるけど、list すらプリミティブなデータ型として用意しないとは、、、、どんだけミニマム主義なんだ(汗

問題解答

問2.13
うーんという感じだったのでカンニング。何のことはない、手を動かすだけの問題だった。

m0↓ = c0 – (c0*p0), m0↑ = c0 + (c0*p0)
m1↓ = c1 – (c1*p1), m1↑ = c1 + (c1*p1)

m0*m1 の結果を v とすると、m0,m1 ともに正なので

v↓ = (c0 – (c0*p0))(c1 – (c1*p1))
v↑ = (c0 + (c0*p0))(c1 + (c1*p1))

v↓ = c0*c1 – c0(c1*p1) – c1(c0*p0) + (c0*p0)(c1*p1)
= c0*c1 – c0(c1*p1) – c1(c0*p0) + c0*c1*p0*p1

p0,p1 が小さいのでこの二つを掛けた値はゼロとみなす。

= c0*c1 – c0(c1*p1) – c1(c0*p0)
= c0c1(1-(p1+p0))

よって、誤差は p1+p0 になる。v↑も同様な手順で計算できる。

問題2.14
2.13 で求めた式を使って二つの式を計算してみると、同じになる。あれ?
これは、区間を意識する必要がありそう。。。。。と思って手計算してみたけど埒があかないのでカンニング。

どうやら、代数的に等価なのにプログラムに落とし込むと結果が異なるということがあるらしい。
この一連の問題はちょっと手に負えなさそう。ただ、扱う問題によってはここら辺はかなり大事な内容な気がするので、きちんと時間をかけて手を動かして理解した方がよさそう。

問題2.15,2.16
区間を使った計算の総まとめ的な問題。これまでの、区間の積和演算の知識を使うと直感的にも演算によって導き出される区間が変わりそうな気はする。
この欠点のない区間算術演算パッケージは、できなさそうな気がするんだけどできちゃうんだろうなというのが最初の印象。
ちょっと調べると、本に書いてある通りこれは相当難しい問題らしい。例えばここでは幾つかの議論へのリンクが貼られている。

抵抗値の計算の時、誤差ってどのように扱うって習ったのかな。。。?そういえば記憶が曖昧な気がする。計算時にはそもそも誤差はないものとして扱うことしかしてこなかったかも。

ということで、消化不良ながらも区間つきの値の演算についての項目は終了。一見単純そうなのに、実はかなり難しい問題の典型的な例だったみたい。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です