2011-11-02 43 views
1

對,我有一個浮點數組只存儲1和0。我想只是做一個簡單的測試/檢查數組中的當前插槽爲1,將打印出一點點消息說,這是1,否則爲0繼承人我的代碼:C++檢查浮點數

if(myArray[i] == 1) 
{ 
    cout << "this is 1 !!!!!" << endl; 
} 
else 
{ 
    cout << "this is 0 "; 
} 

但這只是繼續進入「其他」部分。即只打印「這是0」。它有什麼問題(或者什麼錯我?:P)??

+0

這裏信息太少。我們需要了解進入陣列的內容。編輯:是的,這是一個糟糕的設計。現在最熱門的答案就是這樣。但要具體回答爲什麼這個特定的實現不起作用,我們需要更多的代碼。 – Akron

+0

如果你不確定你是否需要他們,並瞭解他們的缺點,請不要使用'float'。 – hochl

+4

任何時候你使用==來比較浮點數,你幾乎可以肯定做錯了 – Nemo

回答

5

偉大的鏈接:What Every Computer Scientist Should Know About Floating-Point Arithmetic

閱讀,你會意識到,1浮點表示,並不完全是整數值1後已經很接近了,但並不完全,這就是爲什麼你的條件總是是假的。

爲什麼要用float來存儲布爾數據?使用一組bool或一個位矢量。

編輯:我實際上沒有想到任何情況下(或爲什麼)你會比較float s的文字,任何人都知道嗎?

2

首先,不要使用花車來存儲10。沒有理由使用float來存儲小整數。

其次,你需要讀入What Every Computer Scientist Should Know About Floating Point Numbers.雖然會經常加班,你應該考慮它們之間的差異的絕對值比較比較浮點值是有一些小的西格瑪(其中西格瑪是一個值,在您的應用程序中,在有效的精度範圍內是有意義的)。

如果abs(x - y) < sigma你可以認爲它們是平等的。

+0

關於「與小西格瑪相比」,這是非常「天真」(沒有任何意圖),並且一如往常,答案更復雜。你指的是絕對錯誤,對某些類別的數字來說很好。如果你的號碼很小,那麼這可能無法工作了。查看任何數字分析文本或類似的東西http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm –

+0

@Alexandre Abreu:正確,這就是爲什麼我也說*其中西格瑪是一個有意義的價值在您的應用程序內有效範圍內的精度*。我可以補充*西格瑪可能不存在*,但絕大多數情況下西格瑪是可以接受的。 –

-1

要麼投的數組元素的int

if ((int)myArray[i] == 1) 

或澆鑄的1float

if (myArray[i] == 1.0f) 
1

根據您的陣列在到達值(即結果的計算結果),所以很難得到精確的0或1作爲浮點結果。在這種情況下,檢查float == 1是否幾乎肯定會是false。

另一方面,在IEEE浮點中,確切的0被存儲爲0x00000000。如果它不是計算的結果,則在數組中插入一個0可以用作標誌而不是存儲單獨的數組。

0

可能有很好的理由,你的浮點數數組中的值是關閉的非常輕微的分數等於1

雖然這不是一個乾淨的解決方案,這應該是足夠的理由要麼使用枚舉或布爾型數組。

if(myArray[i] > 0.9f && myArray[i] < 1.00001f) 
... 
... 
+1

0.9與1.0001相差甚遠,1.00001。 –

+1

你爲什麼張貼[多個答案](http://stackoverflow.com/questions/7988558/c-checking-floats/7988574#7988574)?如果您知道問題的多種解決方案,請將它們添加到相同的答案中。提交後,您始終可以編輯答案。 – Praetorian

+0

@Praetorian:同意! –

3

當浮點數操作,你應該編寫一個多一點的防守:

if (myArray[i] == 1) { 
    cout << "this is 1\n"; 
} else if (myArray[i] == 0) { 
    cout << "this is 0\n"; 
} else { 
    cout << "this is something else, in particular " << myArray[i] << "\n"; 
} 

這應該給你發生了什麼的洞察力。順便說一下,如果您只將數值1.0f0.0f存儲在數組中,那麼使用==運算符來比較浮點數是完全可以的。你只需要確定你認爲1.0真的真的是真的1.0

+1

+1。即使它*打印爲'1.00000',它仍然可能不是真的真的是'1.0'。 –

+0

沒錯,如果遇到這種情況,您仍然可以打印'1000.0 *(myArray [i] - printedValue)',通過放大鏡查看差異。 –

0

原因是浮動不可能準確地表示1.這就是爲什麼你的if條件永遠不會滿足。你將能夠檢查1的唯一方法是對閾值與測試決定是否浮動值靠攏足夠:

const float threshold = 0.0001f; 
if(fabs(myArray[ i ] - 1.0f) < threshold) 
{ 
...do whatever... 
} 

Ofcourse,另一種方式是隻使用整數,如果你只測試整數,這將是更明智的選擇。

+0

浮點數字「1.0f」準確而精確地表示數字「1」,至少在IEEE 754-1985中;我懷疑其他任何浮點實現都不能完全表示這樣一個重要的數字。 –

+0

謝謝你。我站在糾正:) – Carl

0

我已經回答了這個問題 here。你不能做一個「==」來比較float和int。

在你的情況,也許浮動1實際上是0.9999999將被截斷爲0,這是你的程序的輸出已經是正確的。