2012-07-18 90 views
4

我寫了整整一倍浮動功能的Arduino的(無關,但我無法找到任何「適當」的人),我做此項檢查:可以檢查雙「d <0」嗎?

if (d < 0) { 
    d *= -1; 
    bin += "-"; 
} 

我知道,因爲浮點不精確的雙重平等是挑剔的。那麼這樣做安全嗎?或者我應該堅持這一

int compareNums(double x, double y) { 
    if (abs(x - y) <= EPSILON) { 
     return 0; 
    } else if (x > y) { 
     return 1; 
    } else { 
     return -1; 
    } 
} 

和幾個簡單的問題(這是我在我的代碼後面的部分反正使用):如果我做d < 0d < 0.0什麼關係呢?

我將double d乘以10直到它沒有小數部分,因此我執行類似於d == (int) d的檢查。我想知道什麼是一個好的epsilon(我在這裏使用http://msdn.microsoft.com/en-us/library/6x7575x3(v=vs.80).aspx),因爲我不想結束一個無限循環。根據文章0.000000119209是浮動或類似的最小的區別差異。

感謝

+1

'bin + =「 - 」;'無效C ... – 2012-07-18 03:42:48

+0

無論您使用d <0還是d <0.0,我都無所謂。 (請參閱:下面的註釋:[爲什麼將0.1f更改爲0會使性能下降10倍?](http://stackoverflow.com/questions/9314534/why-does-changing-0-1f-to-0-slow ) - 但我無法理解你的最後一段。顯然'd ==(int)d'並不總是成立。 – Mysticial 2012-07-18 03:44:21

+1

@R ..我使用Arduino的字符串類(注意大寫字符串),所以它的工作原理。我會使用C++字符串,但不能在兩者之間進行轉換(並且我需要使用Arduin的Serial來打印字符串)。 – Raekye 2012-07-18 03:59:30

回答

2

d < 0是有效的(雖然我更願意寫d < 0.0。在第一種情況下,零將被「提升」到比較之前的兩倍。

而且到零<>比較雙是完全合法,並且不需要「小量」。

bin += "-";是荒謬的。

一般比較花車/雙打與「==」是無效的,不應該做(除了一些特殊情況,如檢查零或 無窮)。一些語言甚至不允許「浮動」之間的「==」(或等效)。

d == (int) d更無稽之談。

+1

有趣。什麼語言不允許浮點相等比較? – 2012-07-18 04:03:31

+0

@abelenky當我問到時,我錯誤地將它標記爲「c」。這在我的問題中也有點不合適。 'd ==(int)d更無意義。「假設是有點僞代碼。我正在做一個檢查,看看double是否與它的整數相等(即沒有小數部分),但沒有寫出我使用的整個函數) – Raekye 2012-07-18 04:15:54

1

見我回答這個問題:

How dangerous is it to compare floating point values?

具體來說,你不應該使用絕對epsilons並建議不要使用浮點進行任何直到你徹底閱讀並理解每位計算機科學家應該瞭解的浮點運算法則

至於你的問題中的這段代碼,看起來你的目標是打印一個數字的文本表示,只需測試< 0是正確的。不管你寫0還是0.0

+1

對於文本表示,'-0.0'意味着測試'd <0'是不夠的。 – 2012-07-18 03:47:59

+0

只有當你關心如何將'-0.0'顯示爲不同的輸出...如果你關心,那麼需要更多的工作,但是我要解決的更大的問題是,在寫作之前使用不精確的測試來比較符號這個數字很可能會給出完全虛假的輸出... – 2012-07-18 03:50:13

+0

我讀到了這個問題(現在開始每個計算機科學家應該知道什麼是浮點運算:)),這給了我一個很好的epsilon。 +1 – Raekye 2012-07-18 04:13:48