問題1.8

立方根を求める手続きを作成せよ

  1. improveのみ、立方根の手続きに変更すれば良い
  2. せっかくなので、good-enough?等はAnswerBook1.7を参考に作ることにした
  3. 共通関数は別ファイルにまとめることにした(sicp-lib.scm - おんがえしの日記)
(load "sicp-lib.scm")

(define (cbrt x)
  (define (cbrt-iter old new x)
    (if (good-enough? old new)
	new
	(cbrt-iter new (improve new x) x)))
  (define (good-enough? old new)
    (< (abs (- 1.0 (/ old new))) 0.001))
  (define (improve guess x)
    (/ (+ (/ x (square guess)) (* guess 2)) 3))
  (cbrt-iter 1.0 x x))

; 検証用手続き
(define (cbrt-test x)
  (/ (cube (cbrt x)) x))

; 精度テスト

(cbrt-test 1.0)
; 1.0

(cbrt-test 2.0)
; 1.00000193029137

(cbrt-test 0.000001)
; 1.00000010042478

(cbrt 1e10)
; 1.00000048110827