Hi Brad,<div><br></div><div>Yeah found <span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">##flonum.->exact-int at the same time as you wrote.</span></div><div>

<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><br></span></div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">(From tests, for reference, floor is ~15 million per sec always, while inexact->exact takes time for flonums and rationals and for the others is a noop.)</span></div>

<div><br></div><div><font color="#222222" face="arial, sans-serif">So a performant, general definition goes:</font></div><div><br></div><div><div><font face="courier new, monospace">(define ->integer</font></div><div>
<font face="courier new, monospace">  (let ((fixnum-max-as-flonum (##fixnum->flonum ##max-fixnum)))</font></div>
<div><font face="courier new, monospace">    (lambda (n)</font></div><div><font face="courier new, monospace">      (declare (not safe))</font></div><div><font face="courier new, monospace">      (cond</font></div><div><font face="courier new, monospace">       ((##fixnum? n) n)</font></div>

<div><font face="courier new, monospace">       ((##bignum? n) n) ; Bignums are integer by definition</font></div><div><font face="courier new, monospace">       ((##flonum? n) (if (##fl< n fixnum-max-as-flonum)</font></div>

<div><font face="courier new, monospace">                        (##flonum.->fixnum n)</font></div><div><font face="courier new, monospace">                        (##flonum.->exact-int n)))</font></div><div><font face="courier new, monospace">       ((##ratnum? n) </font><span style="font-family:'courier new',monospace">(##inexact->exact (##floor n)))</span></div>

<div><span style="font-family:'courier new',monospace">       (else          (error "Complex numbers not supported"))))))</span></div></div><div><br></div><div><div><font face="courier new, monospace">> (->integer 5)</font></div>

<div><font face="courier new, monospace">5</font></div><div><font face="courier new, monospace">> (->integer 5.)</font></div><div><font face="courier new, monospace">5</font></div><div><font face="courier new, monospace">> (->integer 10/7)</font></div>

<div><font face="courier new, monospace">1</font></div><div><font face="courier new, monospace">> (->integer 1e25)</font></div><div><font face="courier new, monospace">10000000000000000905969664</font></div><div><font face="courier new, monospace">> (->integer 1000000000000000000000000)</font></div>

<div><font face="courier new, monospace">1000000000000000000000000</font></div></div><div><br></div><div>Note that it is a completely safe procedure, even while it has (declare (not safe)) as to make compilation more efficient.</div>

<div><br></div><div>Benchmark:<br><div><font face="courier new, monospace">(->integer 5)                         41,862,119</font></div><div><font face="courier new, monospace">(->integer 5.)                        26,032,509</font></div>

<div><span style="font-family:'courier new',monospace">(->integer 536870912.)                 </span><font face="courier new, monospace">2,625,793 (this is the max flonum + 1, as a fixnum)</font></div><div><font face="courier new, monospace">(->integer 1e15)                       1,097,751</font></div>

<div><font face="courier new, monospace">(->integer 1e25)                         643,797</font></div><div><span style="font-family:'courier new',monospace">(->integer 10/7)                       5,134,476</span></div>

<div><span style="font-family:'courier new',monospace">(->integer 1000000000000000000000000) 41,216,439</span></div></div><div><br></div><div>Well, this is as good as it goes then :)</div><div><br></div><div><div>

Great!</div></div><div><br></div><div><br></div><div>Yes you certainly have a point about the semantics of Gambit/Scheme numerical operations; do you recommend any particular document for really getting them?</div><div><br>

</div><div>Thanks,</div><div>Mikael</div><div><br><div class="gmail_quote">2013/4/25 Bradley Lucier <span dir="ltr"><<a href="mailto:lucier@math.purdue.edu" target="_blank">lucier@math.purdue.edu</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div class="im"><br>
On Apr 24, 2013, at 5:17 PM, Mikael wrote:<br>
<br>
><br>
> I'd love to see the flonum to integer speed a bit higher (yellow above), I mean in C that's just  double d; int i = (int) d; .<br>
<br>
</div>If you want to do that, you can do (##flonum->fixnum d) (undocumented, internal function):<br>
<br>
> (##flonum->fixnum 5.5)<br>
5<br>
> (##flonum->fixnum -5.5)<br>
-5<br>
<br>
But that isn't floor; that doesn't work for large flonums.<br>
<br>
If you want C, you can write C in Gambit.  Many people don't understand the semantics of the numerical operations in Scheme generally, or in Gambit in particular.<br>
<br>
Brad<br>
<br>
</blockquote></div><br></div>