2013-06-25 67 views
0

我想用GSL創建一個直方圖。當我嘗試添加分區1470/100的值時,出現問題。 結果爲14.69999999,當添加到直方圖時,它將被舍入到較低的bin。 我的問題是我如何使1470/100結果在14.7而不是14.69999? 謝謝C++舍入問題

編輯:

int minRange = 14; 
double val; 


val = minRange + j*0.05; 


gsl_histogram_increment(hist, val); 

當VAL被添加到它被認爲是代替14.65 14.7直方圖。 (在這種情況下,j是14)。

我加入1E-6爲val解決的問題。感謝您的幫助

+0

http://floating-point-gui.de/ – JBL

+0

也許我錯了這裏,但如果你想德智體直方圖點,你不能這樣做圓(數量* 100)/10.0?我們可以有代碼提取嗎?不確定您使用的數據類型。 –

+1

僅供參考:IEEE 754浮點中的14.7表示形式:[32位浮點數](http://www.binaryconvert.com/result_float.html?decimal=049052046055)和[64位雙精度值](http ://www.binaryconvert.com/result_double.html?decimal = 049052046055) –

回答

3

這是一個浮點精度問題。解決問題的一個好方法是將統計圖點設置爲離開積分值,例如, 15 - e其中e是10-6的順序。

0

是,

添加1E-6通常工作,但一般而言,您必須截斷浮動時要多加小心。

This blog說明一切,如果你想圓浮點數(也天真的解決方案的缺陷),你可以面對的問題。它還建議以下更健壯的實現 「添加1E-6」

float myround(float f) 
{ 
     if (f >= 0x1.0p23) return f; 
     return (float) (unsigned int) (f + 0.49999997f); 
} 

可以測試myround(0.49999997)= 0和myround(0.49999999)= 1的。

所以我第一次讀到這篇博客呼籲這個問題徹底解決之前!

的另一點是C++ 11有一個名爲的std ::一輪新的函數返回最接近的整數,所以你也可以通過比較std::abs(x - std::round(x)) < epsilon,其中epsilon是你的目標實現四捨五入。再次,這是一個天真的實現,它不像myround那樣健壯(你需要適應double)。