我正在尝试使用c ++中的冒泡排序创建一个程序,我必须包含正负NaN并对它们进行排序,我已经达到了这样的程度,即我的程序将按升序排序为负,包括-0和0,但我坚持做到这一点,以便NaNs不会混淆。
我如何对这些NaN进行排序,可能是整数LHS上的-Nans和RHS上的NaN?
答案 0 :(得分:1)
您可以使用isnan
检测NaN,并使用signbit
检查其符号。您也可以使用signbit
来区分正面和负面。
您需要制作一个自定义比较器来实际进行排序。
比较例子:
bool double_order(double lhs, double rhs)
{
if(std::isnan(lhs)) {
if(std::signbit(lhs)) //Negative NaN is less than anything
return not (std::isnan(rhs) && std::signbit(rhs)); //Except another -NaN
else
return false; //Positive NaN are never less than anything
}
if(std::isnan(rhs))
if(std::signbit(rhs)) //Negative nans are tot larger than anything
return false;
else //Positive NaN are larger than anything
return true; //Except other +NaN, which is covered earlier
if(lhs == 0.0 && rhs == 0.0) //If both operands are 0, check for ±0
return std::signbit(lhs) > std::signbit(rhs); //signbit of negative is true
return lhs < rhs; //Otherwise do normal comparison (covers infinities)
}