在向量

时间:2016-02-08 16:23:44

标签: c++ nan bubble-sort

我正在尝试使用c ++中的冒泡排序创建一个程序,我必须包含正负NaN并对它们进行排序,我已经达到了这样的程度,即我的程序将按升序排序为负,包括-0和0,但我坚持做到这一点,以便NaNs不会混淆。

我如何对这些NaN进行排序,可能是整数LHS上的-Nans和RHS上的NaN?

1 个答案:

答案 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)
}