Skip to content

Instantly share code, notes, and snippets.

@hagino3000
Created July 17, 2012 10:41
Show Gist options
  • Save hagino3000/3128660 to your computer and use it in GitHub Desktop.
Save hagino3000/3128660 to your computer and use it in GitHub Desktop.
SICP study (1.1.7)
;; Newton法の手続きを繰り返す手続き
(define (curt-iter guess x)
(if (good-enough? guess x)
guess
(curt-iter (improve guess x)
x)))
;; 近似を得る手続き
(define (improve guess x)
(/ (+ (* 2 guess)
(/ x (* guess guess)))
3))
;; 二乗と被開平数の差が前もって決めた許容値より小さくなったかを返す手続
(define (good-enough? guess x)
(print "good-enough? " guess)
; ここはabs手続きで浮動小数点数同士の差を取るため
; 指数部の差が大きいと精度が下がる
; 被開平数の100分の1よりも小さければOKとする
(< (abs (- (cube guess) x)) (/ x 100)))
;; 絶対値を返す手続き
(define (abs x)
(if (< x 0)
(- x)
x))
;; 3乗を返す
(define (cube x)
(* x x x))
;; 立方根
(define (curt x)
(print "Calc cube root of " x)
(curt-iter 1.0 x))
(print "-----------------")
(print (curt 2))
(print "-----------------")
(print (curt 3))
(print "-----------------")
(print (curt 4))
(print "-----------------")
(print (curt 8))
(print "-----------------")
(print (curt 10))
(print "-----------------")
(print (curt 0.00001))
;; Newton法の手続きを繰り返す手続き
(define (sqrt-iter guess x)
(if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))
;; 予測値で割る手続き
(define (improve guess x)
(average guess (/ x guess)))
;; 2パラメータの平均を返す手続き
(define (average x y)
(/ (+ x y) 2))
;; 二乗と被開平数の差が前もって決めた許容値より小さくなったかを返す手続
(define (good-enough? guess x)
(print "good-enough? " guess)
(< (abs (- (square guess) x)) 0.001))
;(define (good-enough? guess x)
; (print "good-enough? " guess)
; ; ここはabs手続きで浮動小数点数同士の差を取るため
; ; 指数部の差が大きいと精度が下がる
; ; 被開平数の100分の1よりも小さければOKとする
; (< (abs (- (square guess) x)) (/ x 100)))
;; 絶対値を返す手続き
(define (abs x)
(if (< x 0)
(- x)
x))
;; 二乗を返す
(define (square x)
(* x x))
;; 平方根
(define (sqrt x)
(print "Calc square root of " x)
(sqrt-iter 1.0 x))
(print "-----------------")
(print (sqrt 2))
(print "-----------------")
(print (sqrt 3))
(print "-----------------")
(print (sqrt 4))
(print "-----------------")
; Go to endless loop
;(print (sqrt 66666666666666666666))
;(print "-----------------")
(print (sqrt 1))
(print "-----------------")
(print (sqrt 0.2))
(print "-----------------")
(print (sqrt 0.000004))
(print "-----------------")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment