(define (normalize-impl n mult)
(cond
((= n 0) (list 0 1))
((>= n 1) (normalize-impl (* n 0.1) (* mult 10 )))
((< n 0.1) (normalize-impl (* n 10 ) (* mult 0.1)))
(else (list n mult))))
(define (normalize x)
(normalize-impl x 1))
(define (nearest-impl val optlst higher lower)
(if (null? optlst) (list higher lower)
(let ((next (car optlst))
(rest (cdr optlst)))
(cond
((< val next) (nearest-impl val rest (min higher next) lower))
(else (nearest-impl val rest higher (max lower next)))))))
(define (nearest val lst)
(nearest-impl val lst (apply max lst) (apply min lst)))
(define (nearest-wrap val lst)
(nearest-impl val lst (* 10 (apply min lst)) (* 0.1 (apply max lst))))
; \brief Returns values in a preferred resistor series
;
; \par Function description
; Given a resistor series "E6" "E12" or "E24", return a list of the normalised values.
;
; \param[in] series Resistor seres in use 'E6', 'E12' or 'E24'
; \return The values in the resistor series, normalised to be >= 0.1 and < 1.0
;
(define (res_values series)
(cond
((string= series "E6")
'( 0.10 0.15 0.22 0.33 0.47 0.68 )
)
((string= series "E12")
'( 0.10 0.12 0.15 0.18 0.22 0.27 0.33 0.39 0.47 0.56 0.68 0.82 )
)
((string= series "E24")
'( 0.10 0.11 0.12 0.13 0.15 0.16 0.18 0.20 0.22 0.24 0.27 0.30
0.33 0.36 0.39 0.43 0.47 0.51 0.56 0.62 0.68 0.75 0.82 0.91
)
(else ())))
)
; \brief Resistor prefered value helper
;
; \par Function description
; Given a resistor series and desired value, return a list of close matches.
;
; \param[in] series Resistor seres in use 'E6', 'E12' or 'E24'
; \param[in] value Resistor value desired
; \return A list of closest prefered values
;
(define (preferred series val)
(if (= val 0)
0
(let* (
(norm (normalize val))
(norm_val (car norm))
(norm_mul (cadr norm))
)
(map
(lambda (x) (* x norm_mul))
(nearest-wrap norm_val (res_values series))
))
)
)