我只是碰到了這行代碼:Is if(double)valid C++?
if(lineDirection.length2()){...}
其中length2
返回double
。這有點令我困惑,0.0相當於0,NULL
,和/或false
。
這是C++標準的一部分還是未定義的行爲?
我只是碰到了這行代碼:Is if(double)valid C++?
if(lineDirection.length2()){...}
其中length2
返回double
。這有點令我困惑,0.0相當於0,NULL
,和/或false
。
這是C++標準的一部分還是未定義的行爲?
這是一個非常標準行爲(布爾轉換)
$ 4.12/1 - 「算術, 枚舉,指針,或指針的右值到 成員類型可以轉換爲一個 右值的鍵入bool。零值, 空指針值或空成員 指針值轉換爲false; 任何其他值轉換爲true。
是 - 比較結果是零(0.0),如果結果恰好爲零則返回false,否則返回true。
該行爲是從C繼承的,C以同樣的方式處理等效比較。
當您比較沒有運算符時,您正在比較「與真實」,以便每個變量類型被檢查爲布爾(簡單情況)或其他。數字變量類型的虛假值被定義爲「0」,「0.0」左右,所以當你比較它們「與真實」時,你的比較將返回false。
值得注意的是,這段代碼對於浮點表示來說非常脆弱。當且僅當浮點值恰好爲0時,此代碼才能工作,在大多數情況下,這實際上不太可能。它可能不是在這種特殊情況下,但如果是這樣的話,它肯定會被記錄/評論。
在幾乎所有其他情況下,您需要決定一個"epsilon value",它定義了您認爲「相同」的浮點數的範圍 - 否則您的比較很可能會讓您在轉角處(並且通常不是這樣的轉角)情況。
+1指出代碼的脆弱性。這可能會在很多情況下突破,這可能並不明顯:double d = 0.0/-1.0;如果(d)'產生錯誤,則爲'-0.0!= 0.0',並且對於可能產生足夠接近'0'值而非完全**'0.0'的許多其他操作也是如此。 – 2010-09-22 07:48:28
確定。可能代碼「double x = 0.0; if(x){cout <<」x不是null「;}」print「x不是null」? – 2010-09-22 07:49:47
@DavidRodríguez - dribeas:不,'-0.0 == 0.0',即使位模式不同。這非常重要。表達式'(x == 0.0 ||(1.0/x))'將不會評估'1.0/x',這將導致除以零。 – MSalters 2010-09-22 07:56:25
如果length2返回0.0,它將被視爲false。但是通過這種比較你可能會得到令人驚訝的結果。像MadKeithV在浮點比較中所建議的那樣更好地使用epsilon值。
還要注意NaN – 2010-09-22 08:55:39