私はちょうどこのコード行に出くわしました:
if( lineDirection.length2() ){...}
ここで、をlength2
返しますdouble
。NULL
0.0が0、、、および/またはに相当するのはちょっと困惑しますfalse
。
これはC++標準の一部ですか、それとも未定義の動作ですか?
私はちょうどこのコード行に出くわしました:
if( lineDirection.length2() ){...}
ここで、をlength2
返しますdouble
。NULL
0.0が0、、、および/またはに相当するのはちょっと困惑しますfalse
。
これはC++標準の一部ですか、それとも未定義の動作ですか?
これは非常に標準的な動作です(ブール変換)
$ 4.12 / 1-"算術、列挙、ポインター、またはメンバー型へのポインターの右辺値は、ブール型の右辺値に変換できます。ゼロ値、ヌルポインター値、またはヌルメンバーポインター値はfalseに変換されます。その他の値trueに変換されます。」
はい-比較はゼロ(0.0)に対して行われ、結果が正確にゼロの場合はfalseを返し、それ以外の場合はtrueを返します。
動作はCから継承され、同等の比較を同じように扱います。
このコードは、浮動小数点表現に対して非常に脆弱であることに注意してください。このコードは、浮動小数点値が正確に 0 である場合にのみ機能しますが、これはほとんどの状況で実際にはほとんどありません。この特定のケースではないかもしれませんが、その場合は必ず文書化/コメントする必要があります。
事実上、他のすべての状況では、「同じ」と見なす浮動小数点数の範囲を定義する「イプシロン値」を決定する必要があります。そうしないと、比較がコーナーで驚かされる可能性が非常に高くなります (多くの場合、それほどコーナーではありません)。ケース。
演算子なしで比較する場合は、「trueと比較」しているため、すべての変数タイプがブール(単純な場合)またはその他のいずれかであるかどうかがチェックされます。数値変数タイプのfalse値は、「0」、「0.0」などとして定義されているため、「trueと」比較すると、比較ではfalseが返されます。
length2 が 0.0 を返す場合、false と見なされます。しかし、この比較で驚くべき結果が得られるかもしれません。浮動小数点比較中に MadKeithV が提案したように、イプシロン値を使用することをお勧めします。