summaryrefslogtreecommitdiff
path: root/coding-exercises/2/14.rkt
blob: c2a0ca9a1213d8ae7b64abe0e909cf6fbee5c8a3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#lang racket
(require "../../shared/intervals.rkt")

(define (print-interval-percent i)
  (newline)
  (display "interval{")
  (display (center i))
  (display ",")
  (display (percent i))
  (display "}")
  (newline))

(define (lem1 i1 i2)
  (div-interval (mul-interval i1 i2)
                (add-interval i1 i2)))

(define (lem2 i1 i2)
  (let ((one (make-center-percent 1.0 0)))
    (div-interval 
      one
      (add-interval 
        (div-interval one i1)
        (div-interval one i2)))))

;; adding scales the heighest percent to the new center
(define (print-add)
  (let ((i1 (make-center-percent 100.0 2.0))
        (i2 (make-center-percent 200.0 3.0)))
    (newline)
    (println "*** add")
    (print-interval-percent i1)
    (print-interval-percent i2)
    (print-interval-percent (add-interval i1 i1))
    (print-interval-percent (add-interval i1 i2))
    (print-interval-percent (sub-interval i1 i1))
    (print-interval-percent (sub-interval i1 i2))))

;; multiplication and addition of positive intervals
;; adds percentage from both intervals
(define (print-mul)
  (let ((i1 (make-interval 2.0 8.0))
        (i2 (make-interval 2.0 8.0)))
    (newline)
    (println "*** mul")
    (print-interval-percent i1)
    (print-interval-percent i2)
    (print-interval-percent (div-interval i1 i1))
    (print-interval-percent (div-interval i1 i2))
    (print-interval-percent (mul-interval i1 i1))
    (print-interval-percent (mul-interval i1 i2))))
  
;; There are at least some problems as I understand from 2.14 and 2.15:
;; 1. Repeated intervals in an equation are dependent on each other
;; 2. Multiplicative identity is undefined and should not be uncertain
;;
;; In 2.16 I would try to rewrite the code to try to make the inverse under multiplication certain
;; and would try to keep track of dependent intervals and maybe only introduce uncertainty once.
(define (print-lem)
  (let ((i1 (make-center-percent 100.0 2.0))
        (i2 (make-center-percent 200.0 3.0)))
    (newline)
    (println "*** lem")
    (print-interval-percent i1)
    (print-interval-percent i2)
    (print-interval-percent (lem1 i1 i2))
    (print-interval-percent (lem2 i1 i2))))
(print-add)
(print-mul)
(print-lem)