簡體   English   中英

C ++檢查浮點數

[英]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.0f0.0f值,則可以使用==運算符比較浮點數是完全可以的。 你只需要確保你的想法1.0是真的真的真的1.0

首先,不要使用浮點數存儲10 沒有理由使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM