float to int conversions

Richard Dobson RWD at cableinet.co.uk
Wed Jun 10 04:32:07 EDT 1998

Yes, it's fast, but it does not work correctly for negative numbers - to comply
with expected C semantics, the int cast must truncate positive numbers
downwards, and negative numbers upwards, so that -0.5 truncates to 0.0. This
routine truncates -1.0 to -2.0!

It maybe that the Intel code is the fastest compliant way of doing things, on
the principle that if there was a faster way of doing it, presumably they would
use it. ~;-)

Richard Dobson

Chris Townsend wrote:
> I can't believe I forgot the most obvious method to do truncatation (thanks
> Chris W.).  Just subtract 1/2.  Here's the updated code to do truncation.
> It should only take 1 or 2 cycles more, and we can mix and match rounding
> and truncation with little overhead.  This seems like an almost ideal
> solution to me.
> float OneHalfOffset=0.5;
> // Truncate instead of round
> __inline int truncate(float fval)
> {
>         int result;
>         _asm{
>                 fld     fval
>                 fsub   OneHalfOffset
>                 fistp   result
>                 mov     eax,result
>         }
> }
> Chris

More information about the music-dsp mailing list