(define (nan? x)
  (and (real? x) (not (= x x))))

(define (finite? x)
  (if (real? x)
      (and (not (nan? x)) (not (= x +inf.0)) (not (= x -inf.0)))
      (and (complex? x) (finite? (real-part x)) (finite? (imag-part x)))))

(define (infinite? x)
  (and (number? x) (not (finite? x)) (not (nan? x))))