Efficiently implementing floored / euclidean integer division

后端 未结 6 830
花落未央
花落未央 2020-12-14 17:02

Floored division is when the result is always floored down (towards −∞), not towards 0:

\"division

6条回答
  •  南方客
    南方客 (楼主)
    2020-12-14 17:53

    I've written a test program to benchmark the ideas presented here:

    #include 
    #include 
    #include 
    #include 
    
    #define N 10000000
    #define M 100
    
    int dividends[N], divisors[N], results[N];
    
    __forceinline int floordiv_signcheck(int a, int b)
    {
        return (a<0 ? a-(b-1) : a) / b;
    }
    
    __forceinline int floordiv_signcheck2(int a, int b)
    {
        return (a - (a<0 ? b-1 : 0)) / b;
    }
    
    __forceinline int floordiv_signmultiply(int a, int b)
    {
        return (a + (a>>(sizeof(a)*8-1))*(b-1)) / b;
    }
    
    __forceinline int floordiv_floatingpoint(int a, int b)
    {
        // I imagine that the call to floor can be replaced to a cast
        // if you can get FPU rounding control to work (I couldn't).
        return floor((double)a / b);
    }
    
    void main()
    {
        for (int i=0; i

    Results:

    signcheck    :  61458768
    signcheck2   :  61284370
    signmultiply :  61625076
    floatingpoint: 287315364
    

    So, according to my results, checking the sign is the fastest:

    (a - (a<0 ? b-1 : 0)) / b
    

提交回复
热议问题