; calculating logarithms
(define epsilon 1e-7)
(define (newton x2)
(let loop ((x 1.0))
(if (< (abs (- (* x x) x2)) epsilon) x
(loop (- x (/ (- (* x x) x2) (+ x x)))))))
(define (euler base n)
(let loop ((lo 1.0) (log-lo 0.0) (hi 1.0) (log-hi 0.0))
(cond ((< hi n) (loop lo log-lo (* hi base) (+ log-hi 1)))
((< (abs (- (/ log-lo log-hi) 1)) epsilon)
(/ (+ log-lo log-hi) 2))
(else (let* ((next (newton (* lo hi)))
(log-next (/ (+ log-lo log-hi) 2)))
(if (< next n)
(loop next log-next hi log-hi)
(loop lo log-lo next log-next)))))))
(display (newton 2)) (newline)
(display (euler 10 612)) (newline)
(display (expt 10 2.7867514193058014)) (newline)