まず、浮動小数点変数を使用したり、浮動小数点変数を使用したりしないでください。浮動小数点型の制限により、一見無害に見える値でさえ同じように比較できない可能性があるため、これらは本質的に無意味な操作です。2 + 2 が 4 ではない可能性は、少なくともそれを特定する限りではあり得ます。==
!=
==
ここでの本当の問題は、「ゼロ」値の符号を使用していることです。これは、上記のように、そもそも実際には正確にゼロではない可能性がありますが、さらに重要なことに、標準の比較演算子を使用してテストするのは困難です。議論については、この関連する質問を参照してください。
C++ 11またはそれをサポートするコンパイラにアクセスできる場合、これに対する最良の解決策は、copysign
その質問に対するVladの回答に従って使用することです。この関数は 2 つのパラメーターを取ります。1 つ目は戻り値の大きさを表し、2 つ目は符号を表します。次に例を示します。
#include "iostream"
#include <math.h>
using namespace std;
int main()
{
double posZero = +0.0d;
double negZero = -0.0d;
if( copysign( 1, posZero ) < 0 )
{
cout << "posZero is negative\n";
}
else
{
cout << "posZero is positive\n";
}
if( copysign( 1, negZero ) < 0 )
{
cout << "negZero is negative\n";
}
else
{
cout << "negZero is positive\n";
}
}
posZero は正
です negZero は負です
この例でcopysign
は、2 番目の引数の符号に従って、+/- 1 の値を作成します。目的の最初の引数は、ゼロ以外の任意の値にすることができますが、1 にすることもできます。
あるいは、おそらくより直接的なsignbitを使用することもできます。この関数を使用した上記のバージョン:
#include "iostream"
#include <math.h>
using namespace std;
int main()
{
double posZero = +0.0d;
double negZero = -0.0d;
if( signbit( posZero ) )
{
cout << "posZero is negative\n";
}
else
{
cout << "posZero is positive\n";
}
if( signbit( negZero ) )
{
cout << "negZero is negative\n";
}
else
{
cout << "negZero is positive\n";
}
}
同じ出力で。