2013-03-03 155 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