同等性を比較する場合、使用しても大丈夫==
ですか?
例えば:
int a = 3;
int b = 4;
同等性をチェックする場合は、次を使用する必要があります。
if (a == b)
{
. . .
}
浮動小数点数を使用した場合、状況は変わりますか?
' ==
'は整数値に完全に適しています。
フロートを比較して等しいかどうかを比較しないでください。許容範囲のアプローチを使用します。
if (fabs(a - b) < tolerance)
{
// a and b are equal to within tolerance
}
フローティングポイントについて:はい。フロートには==を使用しないでください(または、使用する場合は何をしているかを正確に把握してください)。むしろ次のようなものを使用してください
if (fabs(a - b) < SOME_DELTA) {
...
}
編集:abs()をfabs()に変更
多くのクラスでoperator==
は、通常はとして実装される(!(a < b || b < a))
ため、先に進んで==を使用する必要があります。ミッチウィートが上で言ったように、フロートを除いて。
<と>の比較を行っても、丸め誤差は実際には役に立ちません。MarkSheararによって提供されたソリューションを使用してください。ただし、フロートの直接の等式比較は必ずしも悪いわけではありません。特定の値(たとえば、0.0または1.0)が変数に直接割り当てられている場合は、それらを使用して、変数にその値がまだあるかどうかを確認できます。丸め誤差が等価性チェックを台無しにするのは、計算の後でのみです。
NaN値を<、>、<=、> =または==で何か(また別のNaN)と比較すると、falseが返されることに注意してください。!=trueを返します。
整数の場合、==
期待どおりの動作をします。それらが等しい場合、それらは等しいです。
フロートの場合、それは別の話です。操作は不正確な結果を生成し、エラーが蓄積します。数字を扱うときは少し曖昧にする必要があります。私が使う
if ( std::abs( a - b )
< std::abs( a ) * ( std::numeric_limits<float_t>::epsilon() * error_margin ) )
float_t
typedefはどこにありますか。これにより、可能な限り正確になり(error_marginが正しく計算されたと仮定)、別のタイプに簡単に調整できます。
さらに、一部の浮動小数点値は数値ではありません。無限大、マイナス無限大、そしてもちろん数値ではありません。==
それらで面白いことをします。無限大は無限大に等しいが、非数は非数に等しくない。
最後に、正と負のゼロがあります。これらは明確ですが、互いに等しいです。それらを分離するには、逆数が正または負の無限大であるかどうかを確認するなどの操作を行う必要があります。(ゼロ除算の例外が発生しないことを確認してください。)
したがって、より具体的な質問がない限り、それで対処できるといいのですが…</ p>
intを比較するときは、==を使用します。「<」と「>」を同時に使用してintの等価性をチェックすると、1回ではなく2回の比較が必要になり、2倍の時間がかかるため、コードが遅くなります。(おそらくコンパイラがあなたのためにそれを修正するでしょうが、あなたは悪いコードを書くことに慣れるべきではありません)。
初期の最適化は悪いことですが、初期の非効率的なコードも同様に悪いことを覚えておいてください。
編集:いくつかの英語を修正しました...