簡體   English   中英

是!NaN不是NaN?

[英]Is !NaN not a NaN?

我遇到了這個用gcc發出警告的代碼:

float f;
// Calculate a value for f
if (!f == 0.0)
{
    // Handle it being non-zero
}

這可能只是另一個團隊成員的錯字,並檢查代碼的真正含義是:

if (f != 0.0)
// OR
if (!(f == 0.0))

我已經糾正了代碼,但我只是想知道會是什么!NaN評估到了。 我們在if使用f值,所以我們不希望NaN通過檢查。

如果你想避免內部為NaN if ,您可以使用該功能

bool isnan( float arg );

進行檢查。

從功能的參考

NaN值永遠不會與其自身或其他NaN值相等。 IEEE-754不需要復制NaN來保留其位表示(符號和有效負載),盡管大多數實現都是如此。

測試浮點值是否為NaN的另一種方法是將其與自身進行比較:

bool is_nan(double x) { return x != x; } 

C ++草案(N4713)規定:

8.5.2.1一元運算符[expr.unary.op]
...
9.邏輯否定運算符的操作數! 在上下文中轉換為bool (第7條); 它的值是true ,如果轉換后的操作數是falsefalse ,否則。 結果的類型是bool

7.14布爾轉換[conv.bool]
1.算術,無范圍枚舉,指針或指向成員類型的prvalue可以轉換為bool類型的prvalue。 零值,空指針值或空成員指針值轉換為false; 任何其他值都轉換為true。

結論:由於NaN在表達式中被上下文轉換為true !NaN!NaNfalse ,因此不是NaN

請參閱https://en.cppreference.com/w/cpp/language/implicit_conversion

可以將整數,浮點,無范圍枚舉,指針和指針到成員類型的prvalue轉換為bool類型的prvalue。

零值(對於整數,浮點和未整數枚舉)以及空指針和空指針到成員值將變為false。 所有其他值都成為現實

因此!f == 0.0相當於!(f != 0.0) == 0.0(f == 0.0) == falsef != 0.0

簡單地使用

if (!isnan(f)&& !f == 0.0)
    {
        cout<<"Filtered NaN values"<<endl;

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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