2011-02-25 55 views
3

有沒有人有一個想法如何實現方法/函數Int()floor()? 我正在尋找相應的實現,因爲以下是abs()函數。floor()/ int()函數的實現

Int Abs (float x){ 
    if x > 0 
     return x; 
    else 
     return -x 
} 

我在努力爲它找到一個解決方案,而無需使用模運算符。

+3

一個跡象表明,爲什麼在這個世界上你需要這個會很好。 –

回答

16

我看來,像

floor(n) = n - (n % 1) 

應該做的伎倆。

+1

這個答案對於內置地板功能不可用的地板非常適用,它可以作爲模數的實際解釋。謝謝! – invert

+0

這是完美的。你有'ceil()'類似的實現嗎? – Naikrovek

+0

@Naikrovek ceil(x)= -floor(-x);沒有仔細思考就很容易實現。 –

3

使用IEEE 754 binary floating point representation一個可能的解決方案是:

float myFloor(float x) 
{ 
    if (x == 0.0) 
    return 0; 

    union 
    { 
    float input; // assumes sizeof(float) == sizeof(int) 
    int output; 
    } data; 

    data.input = x; 

    // get the exponent 23~30 bit  
    int exp = data.output & (255 << 23); 
    exp = exp >> 23; 

    // get the mantissa 0~22 bit 
    int man = data.output & ((1 << 23) - 1); 

    int pow = exp - 127; 
    int mulFactor = 1; 

    int i = abs(pow); 
    while (i--) 
    mulFactor *= 2; 

    unsigned long long denominator = 1 << 23; 
    unsigned long long numerator = man + denominator; 

    // most significant bit represents the sign of the number 
    bool negative = (data.output >> 31) != 0; 

    if (pow < 0) 
    denominator *= mulFactor; 
    else 
    numerator *= mulFactor; 

    float res = 0.0; 
    while (numerator >= denominator) { 
    res++; 
    numerator -= denominator; 
    } 

    if (negative) { 
    res = -res; 
    if (numerator != 0) 
     res -= 1; 
    } 

    return res; 
} 


int main(int /*argc*/, char **/*argv*/) 
{ 
    cout << myFloor(-1234.) << " " << floor(-1234.) << endl; 

    return 0; 
} 
+0

這與[Michal's](http://stackoverflow.com/a/6437076/774086),[Seronis's](http://stackoverflow.com/a/26091248/774086)和[TheJubilex's](http: //stackoverflow.com/a/5123037/774086)答案? –

1

如果類型的 'INT' 的結果是足夠的,則這裏是一個簡單的選擇:

int ifloor(float x) 
{ 
    if (x >= 0) 
    { 
     return (int)x; 
    } 
    else 
    { 
     int y = (int)x; 
     return ((float)y == x) ? y : y - 1; 
    } 
} 
1
private static int fastFloor(double x) { 
    int xi = (int)x; 
    return x < xi ? xi - 1 : xi; 
} 

這是一個方法類似於Michal Crzardybons的答案,但是它避免了一個條件分支,並且仍能正確處理負數。

+0

我想你的病情也是 – chouaib

+0

是的。我沒有說它避免了所有分支。我說它避免了'一個'條件分支。他使用2個分支。礦用1。 – Seronis