2013-03-03 146 views
2

所以,我有兩個雙變量,我想比較它們到3位小數。所以,對於變量(例如):比較arduino中的兩個雙變量

double x = 0.695999; 
double y = 0.695111; 

如果我檢查(X == Y),它應返回true(因爲兩者是平等的,直到3位小數)。謝謝!

+0

編譯器和我們甚至知道你的意圖是什麼?編譯器/我們不是physic – 2013-03-03 07:55:37

+0

可能是,如果C有一個像這樣的函數:比較(double v1,double v2,int precision)?不是心理,但我們將信息傳遞給方法參數? – 2013-03-03 07:56:58

回答

6

你可以(AB)使用整數比較和截斷:

int is_equal_3decplaces(double a, double b) { 
    long long ai = a * 1000; 
    long long bi = b * 1000; 
    return ai == bi; 
} 

正如@ DavidRF的基準測試表明,它,這個解決方案提供了性能上的輕微(〜40%)的改善相比,計算絕對值。

+1

這是一個有趣的黑客! :) – 2013-03-03 07:57:37

+0

愛它!簡單而有效 – 2013-03-03 09:37:31

+0

@DavidRF Yap,我認爲它可能比調用abs更好,然後比較epsilon(不確定,但 - 運行一些基準會很有趣)。 – 2013-03-03 09:39:07

4

實際上應該檢查差值是否小於預先配置的小差值,除非您總是希望檢查其小數點後三位。例如:

#define epsilon ((double)0.000999) 
bool is_approximately_equal(double x, double y) 
{ 
     return (abs(x - y) < epsilon); 
} 

請注意,C++上的abs具有abs的雙倍版本。在C中,你必須用-ve值做一些事情。

+1

Nah,爲了可讀性,返回abs(x-y)<ε>。 – 2013-03-03 08:00:14

+0

'abs'操作整數不是浮點數 – mttrb 2013-03-03 08:01:07

+1

已更改。謝謝!以爲其他更有啓發性,但反正不會有太大的改變。 – user1952500 2013-03-03 08:01:30