What is the fastest way to convert float to int on x86

前端 未结 10 2229
轻奢々
轻奢々 2020-11-28 11:26

What is the fastest way you know to convert a floating-point number to an int on an x86 CPU. Preferrably in C or assembly (that can be in-lined in C) for any combination of

10条回答
  •  粉色の甜心
    2020-11-28 11:58

    The Lua code base has the following snippet to do this (check in src/luaconf.h from www.lua.org). If you find (SO finds) a faster way, I'm sure they'd be thrilled.

    Oh, lua_Number means double. :)

    /*
    @@ lua_number2int is a macro to convert lua_Number to int.
    @@ lua_number2integer is a macro to convert lua_Number to lua_Integer.
    ** CHANGE them if you know a faster way to convert a lua_Number to
    ** int (with any rounding method and without throwing errors) in your
    ** system. In Pentium machines, a naive typecast from double to int
    ** in C is extremely slow, so any alternative is worth trying.
    */
    
    /* On a Pentium, resort to a trick */
    #if defined(LUA_NUMBER_DOUBLE) && !defined(LUA_ANSI) && !defined(__SSE2__) && \
        (defined(__i386) || defined (_M_IX86) || defined(__i386__))
    
    /* On a Microsoft compiler, use assembler */
    #if defined(_MSC_VER)
    
    #define lua_number2int(i,d)   __asm fld d   __asm fistp i
    #define lua_number2integer(i,n)     lua_number2int(i, n)
    
    /* the next trick should work on any Pentium, but sometimes clashes
       with a DirectX idiosyncrasy */
    #else
    
    union luai_Cast { double l_d; long l_l; };
    #define lua_number2int(i,d) \
      { volatile union luai_Cast u; u.l_d = (d) + 6755399441055744.0; (i) = u.l_l; }
    #define lua_number2integer(i,n)     lua_number2int(i, n)
    
    #endif
    
    /* this option always works, but may be slow */
    #else
    #define lua_number2int(i,d) ((i)=(int)(d))
    #define lua_number2integer(i,d) ((i)=(lua_Integer)(d))
    
    #endif
    

提交回复
热议问题