首先,您永远不应该使用==
或!=
使用浮点变量。它们本质上是无意义的操作,因为浮点类型的限制意味着即使看似无害的值也可能无法进行相同的比较。2 + 2 完全有可能不是 4,至少==
就识别它而言。
这里真正的问题是您正在使用“零”值的符号,如上所述,它可能实际上并不完全为零,但更重要的是,很难使用标准比较运算符进行测试。请参阅此相关问题进行一些讨论。
如果您可以访问 C++11 或支持它的编译器,则最好的解决方案是copysign
按照 Vlad 对该问题的回答使用。该函数有 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
中,根据第二个参数上的符号创建一个 +/- 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";
}
}
具有相同的输出。