2010-04-12 58 views
5

我想實現最大整數函數。 [「最偉大的整數函數」是quitestandard name什麼也被稱爲地板功能。]C++整數下限函數

int x = 5/3; 

我的問題是有更大的數字可能會有精度的損失爲5/3會產生一個雙?

編輯:最大整數函數整數小於或等於X 例:

4.5 = 4 
4 = 4 
3.2 = 3 
3 = 3 

我想知道的是5/3會產生一個雙?因爲如果是的話,我將在轉換爲int時失去精度。

希望這是有道理的。

+2

什麼是最大整數函數? – Andrey 2010-04-12 13:40:09

+0

請注意,在C和C++中,作用於整數的'/'運算符總是返回一個整數結果。除此之外,我認爲你需要更具體地說明你想要的東西---你的函數是否會返回最大的整數**少於一個給定的數字?這個數字會有什麼類型?如果它是'float'或'double',無論如何你都會失去精度。如果它是一個自制類型,可以模擬**理性**數字,則可以避免精度損失。 – Pillsy 2010-04-12 13:42:28

+4

這是一個返回*最大*整數的函數!我相信最大的一個是1,000,001 – 2010-04-12 13:43:12

回答

5

您將失去商的小數部分。所以是的,數量越多,您的相對精度就越高,如與5000/3000相比。

但是,5/3將返回一個整數,而不是double。爲了強制它分成兩倍,請註明股息爲(double)5/3

+0

感謝所有我需要知道的。 – Thomas 2010-04-12 13:51:55

1

5/3總是會產生1(整數),如果你做5.0/3或5/3.0,結果將是雙倍的。

0

由於在C和C++中,正如其他人所說,/是整數除法,它將返回一個int。特別是,它會返回雙重答案的底線......(C和C++總是截斷)所以,基本上5/3正是你想要的。

它可能會在底片有點怪異作爲-5/3 => -2這可能是也可能不是你想要的...

+4

但是,如果你很聰明,你可以使用底片來實現整數'ceil()'...... – 2010-04-12 13:54:08

+0

這是真的。 – 2010-04-12 15:10:06

+1

整數除法返回地板是**不是**! (經常被忽視的)關鍵點是如何處理* negative *數字。這裏-9/4 == -2但是地板(-9.0/4)== -3.0 – Ichthyo 2011-01-08 19:46:21

2

整數除法給出整數結果,所以5/3爲1, 5%3是2(其餘操作員)。但是,這不一定適用於負數。在最初的C++標準中,-5/3可以是-1(向零舍入)或-2(樓層),但建議使用-1。在最新的C++ 0B草案中(幾乎可以肯定非常接近最終標準),它是-1,因此找到負數的底板更爲重要。

0

據我所知,沒有爲此預定義的功能。 可能有必要使用這樣的功能,如果由於某種原因,浮點計算是沒問題的(如int64_t具有更高的精度比double可以沒有錯誤代表)

如下,我們可以定義此功能:

#include <cmath> 

inline long 
floordiv (long num, long den) 
{ 
    if (0 < (num^den)) 
    return num/den; 
    else 
    { 
     ldiv_t res = ldiv(num,den); 
     return (res.rem)? res.quot-1 
         : res.quot; 
    } 
} 

這個想法是使用正常的整數除法,但調整負結果以匹配double floor(double)函數的行爲。重點是總是朝向下一個較低的整數截斷,而不管零點的位置如何。如果意圖是創建大小均勻的間隔,這可能非常重要。

定時測量結果表明,這裏該功能只創建與內置/運營商,但當然,基於浮點floor功能比較小的開銷是顯著快....