2015-07-04 46 views
1

例如,考慮將數字與NaN進行比較的結果是什麼?

bool fun (double a, double b) { 
    return a < b; 
} 

會有什麼fun回報,如果任何參數爲NaN?這是未定義/實現定義的行爲?

其他關係運算符和相等運算符會發生什麼?

+2

[這個問題]的答案(http://stackoverflow.com/questions/15268864/how-to-compare-two-nan-values-in-c)解決它。 (我邊界認爲這個問題是重複的,順便說一句)。 –

+1

@AmiTavory這個答案只處理平等情況。 –

+0

@BaummitAugen http://stackoverflow.com/a/15268938/985296 – stefan

回答

7

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

+0

這個調用也會調用UB嗎? –

+0

很難想象a)支持'NaN'值的實現,但b)沒有它們按照IEEE 754的規定。在任何理智的實現中,如果其中一個或兩個操作數都是'NaN',則'a

+0

您可以使IEEE部分更嚴格嗎? –

1

假。

真的沒有-NaN這樣的東西,儘管NaN值確實帶有符號位以及有效載荷。但是爲了算術目的,NaN是NaN是NaN。

與NaN的任何相等或有序的比較都是錯誤的。

+0

你可以用['signbit'](http://en.cppreference.com/w/cpp/numeric/math/signbit)得到NaN的符號。 –

+0

@KerrekSB:但是你不能使用'-NaN'來移動NaN的符號,只能使用'std :: copysign'。 –

5

使用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對於爲什麼楠總是假的理由。

+1

尼斯鏈接,upvoted。我會在另一個答案上留下接受,因爲我覺得從C++的角度來看它更完整。 –

相關問題