[英]C++ checking floats
正確,我有一個浮點數數組,僅存儲1和0。 我試圖做一個簡單的測試/檢查數組中的當前插槽是否為1,它會打印出一條小消息說它為1,否則為0。這是我的代碼:
if(myArray[i] == 1)
{
cout << "this is 1 !!!!!" << endl;
}
else
{
cout << "this is 0 ";
}
但這只會繼續進入“其他”部分。 即只打印“這是0”。 它有什么問題(或我有什么問題?
很棒的鏈接: 每位計算機科學家都應該對浮點算法了解什么
讀完之后,您會發現1的浮點表示不是一個整數值1。它接近但不完全是整數,因此您的條件將始終為false。
為什么要使用float
來存儲布爾數據? 使用bool
數組或位向量。
編輯:我實際上無法想到任何情況(或為什么)將float
與文字進行比較,有人知道嗎?
使用浮點數進行操作時,您應該編寫一些防御性的程序:
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.0f
和0.0f
值,則可以使用==
運算符比較浮點數是完全可以的。 你只需要確保你的想法是1.0
是真的真的真的1.0
。
首先,不要使用浮點數存儲1
或0
。 沒有理由使用float
來存儲小整數。
其次,您需要閱讀每位計算機科學家應該知道的有關浮點數的知識。 盡管它通常會起作用,但是您應該比較浮點值,方法是取它們之間的差的絕對值,然后將其與一些小的sigma(其中sigma是在精度的有效范圍內對您的應用有意義的值)進行比較。
如果abs( x - y ) < sigma
,則可以認為它們相等。
根據您得出數組中值的方式(即計算結果)的不同,獲得浮點結果的精確度極不可能為0或1。 在這種情況下,檢查float == 1是否精確將幾乎肯定是錯誤的。
另一方面,在IEEE浮點中,精確的0被存儲為0x00000000。 如果不是計算結果,則在數組中加上0可以用作標志,而不是存儲單獨的數組。
很有可能是因為您的浮點數組中的值相差很小,等於1。
盡管這不是一個干凈的解決方案,但這應該足以使用枚舉或布爾數組。
if(myArray[i] > 0.9f && myArray[i] < 1.00001f)
...
...
原因是浮點數不可能精確表示1。這就是您的if條件永遠無法滿足的原因。 您能夠檢查1的唯一方法是確定閾值並測試float值是否足夠接近:
const float threshold = 0.0001f;
if( fabs( myArray[ i ] - 1.0f ) < threshold )
{
...do whatever...
}
當然,如果僅針對整數進行測試,則另一種方法就是使用ints,這將是更明智的選擇。
我在這里已經回答了一些問題。 您不能執行“ ==”來比較float和int。
在您的情況下,浮點數1實際上是0.9999999,它將被截斷為0,這表示程序的輸出已經正確。
要么將array元素強制轉換為int
:
if ((int)myArray[i] == 1)
或將1
轉換為float
:
if (myArray[i] == 1.0f)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.