M(*x*, *y*) is a number between the geometric and arithmetic mean of *x* and *y*; in particular it is between *x* and *y*. If *r* > 0, then M(*rx*, *ry*) = *r* M(*x*, *y*).

(define agmean(lambda (a b epsilon) (letrec ((ratio-diff ; determine whether two numbers(lambda (a b) ; are already very close together (abs (/ (- a b) b)))) (loop ; actually do the computation (lambda (a b) ;; if they're already really close together, ;; just return the arithmetic mean (if (< (ratio-diff a b) epsilon) (/ (+ a b) 2) ;; otherwise, do another step (loop (sqrt (* a b)) (/ (+ a b) 2))))));; error checking (if (or (not (real? a))(not (real? b)) (<= a 0) (<= b 0)) (error 'agmean "~s and ~s must both be positive real numbers" a b) (loop a b)))))

One can show that

The geometric harmonic mean can be calculated by an analogous method, using sequences of geometric and harmonic means. The arithmetic harmonic mean is none other than the geometric mean.

**See also:** generalized mean