[英]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
,如果轉換后的操作數是false
和false
,否則。 結果的類型是bool 。7.14布爾轉換[conv.bool]
1.算術,無范圍枚舉,指針或指向成員類型的prvalue可以轉換為bool類型的prvalue。 零值,空指針值或空成員指針值轉換為false; 任何其他值都轉換為true。
結論:由於NaN在表達式中被上下文轉換為true
!NaN
, !NaN
是false
,因此不是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) == false
或f != 0.0
簡單地使用
if (!isnan(f)&& !f == 0.0)
{
cout<<"Filtered NaN values"<<endl;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.