例如,考慮將數字與NaN進行比較的結果是什麼?
bool fun (double a, double b) {
return a < b;
}
會有什麼fun
回報,如果任何參數爲NaN?這是未定義/實現定義的行爲?
其他關係運算符和相等運算符會發生什麼?
例如,考慮將數字與NaN進行比較的結果是什麼?
bool fun (double a, double b) {
return a < b;
}
會有什麼fun
回報,如果任何參數爲NaN?這是未定義/實現定義的行爲?
其他關係運算符和相等運算符會發生什麼?
C++標準只是說:
[expr.rel]/5如果兩個操作數(轉化後)是算術或枚舉類型的,每個操作的應如果指定的關係得到
true
是真的,如果它是假的,則爲false
。
所以基本上,a < b
是真,如果a
小於b
。
但是,通過numeric_limits::is_iec559
,該實現可能聲明符合IEC 559又名IEEE 754浮點運算標準。然後,它受5.7節和表4中的該標準的管理,其要求所有的比較,但是!=
涉及NaN
報告false
。 !=
涉及NaN
舉報true
這個調用也會調用UB嗎? –
很難想象a)支持'NaN'值的實現,但b)沒有它們按照IEEE 754的規定。在任何理智的實現中,如果其中一個或兩個操作數都是'NaN',則'a
您可以使IEEE部分更嚴格嗎? –
假。
真的沒有-NaN
這樣的東西,儘管NaN值確實帶有符號位以及有效載荷。但是爲了算術目的,NaN是NaN是NaN。
與NaN的任何相等或有序的比較都是錯誤的。
你可以用['signbit'](http://en.cppreference.com/w/cpp/numeric/math/signbit)得到NaN的符號。 –
@KerrekSB:但是你不能使用'-NaN'來移動NaN的符號,只能使用'std :: copysign'。 –
使用NaN進行的任何比較(除了「!=」)都會返回false。
這裏是我構建了一個表:
+Dbl_Nan 0_Nan Inf_Nan NaN_NaN +Dbl_Inf +Dbl_-Inf Inf_-Inf Inf_Inf
-----------------------------------------------------------------------
> | False False False False False True True False
< | False False False False True False False False
== | False False False False False False False True
!= | True True True True True True True False
點擊here對於爲什麼楠總是假的理由。
尼斯鏈接,upvoted。我會在另一個答案上留下接受,因爲我覺得從C++的角度來看它更完整。 –
[這個問題]的答案(http://stackoverflow.com/questions/15268864/how-to-compare-two-nan-values-in-c)解決它。 (我邊界認爲這個問題是重複的,順便說一句)。 –
@AmiTavory這個答案只處理平等情況。 –
@BaummitAugen http://stackoverflow.com/a/15268938/985296 – stefan