1

私はこの関数を書きました:

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

ここで、Colorは単にfloat[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を返します。

4

2 に答える 2

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 );
}

3つの配列要素すべてが0であるかどうかをチェックし、期待どおりの結果が得られない場合は、配列要素が期待どおりではありません。

アプリケーションによっては、厳密な等式ではなく、近似テストが必要になる場合があります。浮動小数点数の性質上、数学的に同じ結果になる異なる計算が浮動小数点の算術/微積分で異なる結果をもたらすことは珍しいことではありません。通常、差は小さいので(ただし、たとえば、重要性の喪失/壊滅的なキャンセルのために大きくなることもあります)、浮動小数点値が許容値と比較されることがよくあります。

おそらく、col[i] == 0をほぼゼロのテストに置き換えることがfabsf(col[i]) < epsilon、目的に適した戦略です(適切な値はepsilonユースケースによって異なります)。

于 2012-11-09T10:58:21.233 に答える
1

コンパイラーを無音にしたい場合は、評価順序を強制するために括弧を追加する必要があります。しかし、あなたの比較は間違っているようです。あなたはそれをそのようにすることはできません。最初のフォームを使ってみませんか?==浮動小数点と演算子の比較が非常に安全でないことを除いて、より読みやすく、正常に機能します。

于 2012-11-09T10:52:33.010 に答える