;;; For most of the procedures specified by SRFI 144, it's faster ;;; and just as accurate to use the portable definition instead ;;; of going through Larceny's FFI. ;;; ;;; Only three of the SRFI 144 procedures are substantially more ;;; accurate or faster when implemented using Larceny's FFI: ;;; ;;; fl+* ;;; flfirst-bessel ;;; flsecond-bessel (define nextafter (foreign-lambda double "nextafter" double double)) (define copysign (foreign-lambda double "copysign" double double)) (define ldexp (foreign-lambda double "ldexp" double int)) (define (modf n) (let-location ((integral double)) (let ((frac ((foreign-lambda double "modf" double (c-pointer double)) n (location integral)))) (values frac integral)))) (define logb (foreign-lambda double "logb" double)) (define ilogb (foreign-lambda int "ilogb" double)) (define (frexp n) (let-location ((exp int)) (let ((frac ((foreign-lambda double "frexp" double (c-pointer int)) n (location exp)))) (values frac exp)))) ;;(define signbit MACRO) ;; ;;(define isfinite MACRO) ;;(define isinf MACRO) ;;(define isnan MACRO) ;;(define isnormal MACRO) ; fpclassify is also a macro ;;(define issubnormal MACRO) ; fpclassify is also a macro (define fma (foreign-lambda double "fma" double double double)) (define fabs (foreign-lambda double "fabs" double)) (define fdim (foreign-lambda double "fdim" double double)) (define c:floor (foreign-lambda double "floor" double)) (define ceil (foreign-lambda double "ceil" double)) (define c:round (foreign-lambda double "round" double)) (define trunc (foreign-lambda double "trunc" double)) (define c:exp (foreign-lambda double "exp" double)) (define exp2 (foreign-lambda double "exp2" double)) (define expm1 (foreign-lambda double "expm1" double)) (define c:sqrt (foreign-lambda double "sqrt" double)) (define cbrt (foreign-lambda double "cbrt" double)) (define hypot (foreign-lambda double "hypot" double double)) (define pow (foreign-lambda double "pow" double double)) (define c:log (foreign-lambda double "log" double)) (define log1p (foreign-lambda double "log1p" double)) (define log2 (foreign-lambda double "log2" double)) (define log10 (foreign-lambda double "log10" double)) (define c:sin (foreign-lambda double "sin" double)) (define c:cos (foreign-lambda double "cos" double)) (define c:tan (foreign-lambda double "tan" double)) (define c:asin (foreign-lambda double "asin" double)) (define c:acos (foreign-lambda double "acos" double)) (define c:atan (foreign-lambda double "atan" double)) (define atan2 (foreign-lambda double "atan2" double double)) (define sinh (foreign-lambda double "sinh" double)) (define cosh (foreign-lambda double "cosh" double)) (define tanh (foreign-lambda double "tanh" double)) (define asinh (foreign-lambda double "asinh" double)) (define acosh (foreign-lambda double "acosh" double)) (define atanh (foreign-lambda double "atanh" double)) (define tgamma (foreign-lambda double "tgamma" double)) (define lgamma (foreign-lambda double "lgamma" double)) (define jn (foreign-lambda double "jn" int double)) (define yn (foreign-lambda double "yn" int double)) (define erf (foreign-lambda double "erf" double)) (define erfc (foreign-lambda double "erfc" double))