    (mod fl1 fl2))

  (define (fldiv0-and-mod0 fl1 fl2)
    (assert-iflonum fl1 fl2)
    (div0-and-mod0 fl1 fl2))

  (define (fldiv0 fl1 fl2)
    (assert-iflonum fl1 fl2)
    (div0 fl1 fl2))

  (define (flmod0 fl1 fl2)
    (assert-iflonum fl1 fl2)
    (mod0 fl1 fl2))

  (define (flnumerator fl) (assert-flonum fl) (numerator fl))
  (define (fldenominator fl) (assert-flonum fl) (denominator fl))
  
  (define (flfloor fl) (assert-flonum fl) (floor fl))
  (define (flceiling fl) (assert-flonum fl) (ceiling fl))
  (define (fltruncate fl) (assert-flonum fl) (truncate fl))
  (define (flround fl) (assert-flonum fl) (round fl))

  (define (flexp fl) (assert-flonum fl) (exp fl))
  (define fllog
    (case-lambda
      ((fl)
       (assert-flonum fl)
       ;; add 0.0 to fl, to change -0.0 to 0.0,
       ;; so that (fllog -0.0) will be -inf.0, not -inf.0+pi*i.
       (ensure-flonum (log (+ fl 0.0))))
      ((fl fl2)
       (assert-flonum fl fl2)
       (ensure-flonum (/ (log (+ fl 0.0))
                         (log (+ fl2 0.0)))))))

  (define (flsin fl) (assert-flonum fl) (sin fl))
  (define (flcos fl) (assert-flonum fl) (cos fl))
  (define (fltan fl) (assert-flonum fl) (tan fl))
  (define (flasin fl) (assert-flonum fl) (ensure-flonum (asin fl)))
  (define (flacos fl) (assert-flonum fl) (ensure-flonum (acos fl)))
  (define flatan
    (case-lambda
      ((fl) (assert-flonum fl) (atan fl))
      ((fl fl2) (assert-flonum fl fl2) (atan fl fl2))))

  (define (flsqrt fl) (assert-flonum fl) (ensure-flonum (sqrt fl)))
  (define (flexpt fl1 fl2) (assert-flonum fl1 fl2) (ensure-flonum (expt fl1 fl2)))

  (define-condition-type &no-infinities
    &implementation-restriction
    make-no-infinities-violation
    no-infinities-violation?)

  (define-condition-type &no-nans
    &implementation-restriction
    make-no-nans-violation
    no-nans-violation?)

  (define (fixnum->flonum fx)
    (or (fixnum? fx) (raise (make-assertion-violation))) 
    (exact->inexact fx))
)
