2014年3月16日日曜日

開発環境

計算機プログラムの構造と解釈(Gerald Jay Sussman(原著)、Julie Sussman(原著)、Harold Abelson(原著)、和田 英一(翻訳)、ピアソンエデュケーション、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の2(データによる抽象の構築)、2.1(データ抽象入門)、2.1.4(拡張問題: 区間算術演算)、問題 2.14.を解いてみる。

その他参考書籍

問題 2.14.

コード(BBEdit, Emacs)

sample.scm

#!/usr/bin/env gosh
;; -*- coding: utf-8 -*-

;; これまでに書いた手続き
(load "./procedures.scm")

;; 構成子
;; 区間の中央値とパーセント相対許容誤差
(define (make-center-percent c p)
  ((lambda (x)
     (make-interval (- c x)
                    (+ c x)))
   (* (abs c)
      (/ p 100))))

;; 選択子
;; パーセント相対許容誤差
(define (percent i)
  ((lambda (c)
     (abs (* 100
             (/ (- (upper-bound i)
                   c)
                c))))
   (center i)))

(define (par1 r1 r2)
  (div-interval (mul-interval r1 r2)
                (add-interval r1 r2)))

(define (par2 r1 r2)
  (let ((one (make-interval 1 1)))
    (div-interval one
                  (mul-interval (div-interval one r1)
                                (div-interval one r2)))))

(define a (make-center-percent 10 0.00001))
(define b (make-center-percent 100 0.0001))
(define aa (div-interval a a))
(define ab (div-interval a b))

(for-each (lambda (x)
            (print "中央値: " (center x))
            (print "パーセント相対許容誤差: " (percent x)))
          (list (par1 a b)
                (par2 a b)
                (par1 aa ab)
                (par2 aa ab)
                aa
                ab
                (add-interval aa ab)
                (sub-interval aa ab)
                (mul-interval aa ab)
                (div-interval aa ab)))

入出力結果(Terminal(gosh), REPL(Read, Eval, Print, Loop))

$ ./sample.scm
中央値: 9.090909090926846
パーセント相対許容誤差: 2.0181818182468108e-4
中央値: 1000.0000000000999
パーセント相対許容誤差: 1.0999999999511411e-4
中央値: 0.09090909090924251
パーセント相対許容誤差: 1.5818181813399823e-4
中央値: 0.100000000000134
パーセント相対許容誤差: 1.299999999869107e-4
中央値: 1.00000000000002
パーセント相対許容誤差: 1.9999999989472483e-5
中央値: 0.10000000000011
パーセント相対許容誤差: 1.0999999999749101e-4
中央値: 1.1000000000001302
パーセント相対許容誤差: 2.8181818151841777e-5
中央値: 0.89999999999991
パーセント相対許容誤差: 3.4444444432485765e-5
中央値: 0.10000000000013401
パーセント相対許容誤差: 1.299999999730329e-4
中央値: 10.0000000000035
パーセント相対許容誤差: 1.299999999914803e-4
$

par1とpar2の計算法で異なる結果になることが確認できたので、Lenのいうことは正しい。

0 コメント:

コメントを投稿