Решение упражнения 2.12 из SICP

21 January, 2008 (22:00) | Решения упражнений

Конструктор получается достаточно прямолинейно по формулам

lower-bound = center – center * percent / 100,
upper-bound = center + center * percent / 100:

(define (make-center-percent c p) 
  (let ((w (* c (/ p 100)))) 
    (make-interval (- c w) (+ c w))))

Еще проще выразить конструктор через имеющийся make-center-width

Селектор для percent можно получить, воспользовавшись таким математическим результатом, выразив percent из последней формулы для конструктора:

percent = (upper-bound – center) / center * 100 = (upper-bound – (lower-bound + upper-bound)/2) / [(lower-bound + upper-bound)/2] * 100 = (upper-bound – lower-bound) / (upper-bound + lower-bound) * 100

Соответственно селектор примет следующий вид:

(define (percent i) 
  (let ((l (lower-bound i)) (u (upper-bound i))) 
    (* 100 (/ (- u l) (+ u l)))))

И действительно:

> (make-center-percent 400 3) 
(388 . 412)
> (percent (make-center-percent 400 3)) 
3
 

Comments

Comment from Sergey Khenkin
Date: January 21, 2008, 10:04 pm

Важно понимать, что такое задание интервалов применимо лишь для случаев, когда центр интервала не совпадает с нулем. Сам разговор о погрешности в процентах для нулевого значения не имеет смысла.

Pingback from SICP по-русски » Blog Archive » Решение упражнения 2.13 из SICP
Date: January 21, 2008, 11:07 pm

[…] SICP по-русски Структура и интерпретация компьютерных программ: заметки и решения « Решение упражнения 2.12 из SICP […]

Comment from shini
Date: September 1, 2013, 9:31 pm

Воспринимаем центр интервала за 100% , разницу за Х%.
Делим центр на разницу – получаем проценты.

(define (percent interval)
(* (/ (center interval) (width interval)) 100))

Comment from shini
Date: September 1, 2013, 10:07 pm

Упс, то что я написал выше неправильно. Извеняюсь.

Comment from shini
Date: September 1, 2013, 10:42 pm

(define (percent interval)

(/ 1 (/ (center interval) (width interval))))

Вот это правильно.

Comment from Rokker Ruslan
Date: February 7, 2014, 7:47 am

Насколько я знаю, в тех. проектах используются не “проценты”, а “части”. То есть домножать/делить на 100 – просто лишняя работа.

(define (percent i)
(/ (width i) (center i)))

(define (make-center-percent mean-value inaccuracy)
(let ((width (* mean-value inaccuracy)))
(make-center-width mean-value width)))

Write a comment