On 29-Oct-08, at 8:49 PM, Guillaume Cartier wrote:
If you know your flonum is within the range of fixnums you can use the very efficient ##flonum->fixnum which will basically compile to a cast (correct me Marc if i'm wrong).
There are several ways to truncate an inexact real to an exact integer. Here are a few I can think of with their execution time on a 2 GHz Intel Core Duo when converting the number 152.97 . The last one is over 230 times faster than the first! Of course they are not completely equivalent because they have different constraints on the argument to convert (some assume the result fits in a fixnum, others in a signed 64 bit exact integer, and the first two have no constraint).
Marc
(define (f0 x) ;; 4600 ns per call (declare (standard-bindings)) (inexact->exact (truncate x)))
(define (f1 x) ;; 4000 ns per call (declare (standard-bindings)) (truncate (inexact->exact x)))
(define (f2 x) ;; 85 ns per call ((c-lambda (double) int64 "___result = ___arg1;") x))
(define (f3 x) ;; 25 ns per call (declare (extended-bindings)) (##c-code "___RESULT = ___FIX(___F64UNBOX(___ARG1));" x))
(define (f4 x) ;; 20 ns per call (declare (extended-bindings) (not safe)) (##fl->fx x))