;;;; fp-extn-w.scm ;;;; Kon Lovett, May '06 ;;; For use in modules that perform full-numeric-tower arithmetic ;These are UNSAFE but usage ensures an fp arg (define-inline (fpfloor x) (##core#inline_allocate ("C_a_i_flonum_floor" 4) x)) (define-inline (fptruncate x) (##core#inline_allocate ("C_a_i_flonum_truncate" 4) x)) (define-inline (fpinteger? x) (##core#inline "C_u_i_fpintegerp" x)) (define-inline (fpfraction n) (##sys#flonum-fraction n)) (define-inline (fpzero? n) (fp= 0.0 n)) (define-inline (fppositive? n) (fp< 0.0 n)) (define-inline (fpnegative? n) (fp> 0.0 n)) (define-inline (fpeven? n) (and (fpinteger? n) (fpzero? (fpfraction (fp/ n 2.0))))) (define-inline (fpodd? n) (and (fpinteger? n) (not (fpzero? (fpfraction (fp/ n 2.0)))))) (define-inline (fpmodulo x y) (fp- x (fp* (fpfloor (fp/ x y)) y))) (define-inline (fpquotient x y) (fptruncate (fp/ x y))) #;(define-inline (fpremainder x y) (fp- x (fp* (fpquotient x y) y))) (define-inline (fpremainder x y) (fptruncate ((foreign-lambda double "fmod" double double) x y)))