如何在头文件中使用静态函数并与float数组进行比较

时间:2012-11-09 10:49:37

标签: c gcc

我写了这个函数:

static bool colorIsEmpty(const Color col)
{
    return (col[0] == 0 && col[1] == 0 && col[2] == 0 );
}

其中Color只是一个浮点数[3]; 如果col [3]全为0,则该函数不起作用; 但这很有效:

if(col[0] == col[1] == col[2] == 0) {
//gets called
}

然而gcc给了我警告:

    cColorTest.c:212:5: warning: suggest parentheses around 
comparison in operand of ‘==’ [-Wparentheses]

所以如果该功能有效,为什么它不起作用会很好? 我的意思是函数总是返回false,

2 个答案:

答案 0 :(得分:4)

条件

if(col[0] == col[1] == col[2] == 0) {

是带括号的

if(((col[0] == col[1]) == col[2]) == 0) {

因此,如果col[0] == col[1],它会检查col[2] != 1是否col[0] != col[1],如果col[2] != 0,它会检查static bool colorIsEmpty(const Color col) { return (col[0] == 0 && col[1] == 0 && col[2] == 0 ); } 。我坚信这不是你想要的。

col[i] == 0

检查是否所有三个数组元素都是0,如果它没有给出预期的结果,那么你的数组元素就不是你期望的了。

根据您的应用程序,您可能需要进行近似测试而不是严格相等。由于浮点数的性质,在数学上具有相同结果的不同计算在浮点算术/微积分中导致不同的结果并不罕见。通常差异很小(但也可能变得很大,例如由于loss of significance/catastrophic cancellation),因此通常将浮点值与容差进行比较。

或许将fabsf(col[i]) < epsilon替换为近似零测试,epsilon是适合您目的的正确策略({{1}}的适当值取决于用例)。

答案 1 :(得分:1)

如果要使编译器静音,则应添加括号以强制执行评估顺序。但你的比较似乎是错误的;你不能这样做。你为什么不使用第一张表格?它更具可读性,并且工作正常,除了将浮点数与==运算符进行比较是非常不安全的。