双和NaN的比较结果是什么?

时间:2016-04-26 09:04:17

标签: c++ c++11 nan

我有以下程序:

var flowLayout = new UICollectionViewFlowLayout (){
    ItemSize = new CGSize ((float)UIScreen.MainScreen.Bounds.Size.Width/2.0f, (float)UIScreen.MainScreen.Bounds.Size.Width/2.0f),
    HeaderReferenceSize = new CGSize (100, 100),
    SectionInset = new UIEdgeInsets (0,0,0,0),
    ScrollDirection = UICollectionViewScrollDirection.Vertical,
    MinimumInteritemSpacing = 0, // minimum spacing between cells
    MinimumLineSpacing = 0 // minimum spacing between rows if ScrollDirection is Vertical or between columns if Horizontal
};

sectionGrid.PerformBatchUpdates (() => {
    sectionGrid.CollectionViewLayout.InvalidateLayout ();
    sectionGrid.SetCollectionViewLayout (flowLayout, false);
});

输出:

#include <iostream>
#include <cmath>

int main() {
    double a = 1;
    double b = nan("");

    std::cout << (a > b) << std::endl;
    std::cout << (b > a) << std::endl;

    return 0;
}

一般来说,0 0 - nan的含义很明显,任何not a number的操作都是毫无意义的。从我在互联网上找到的nan我发现,如果在FPU中至少有一个操作数是IEEE-754,结果也是nan,但我没有发现正常值和{{之间的比较1}}如上例所示。

标准对此有何看法?

4 个答案:

答案 0 :(得分:7)

  

标准对此有何看法?

C ++标准没有说明对NaN的操作如何表现。它没有具体说明。因此,就C ++而言,任何结果都是可能的并且是允许的。

ANSI / IEEE Std 754-1985说:

  

5.7。比较

     

......每个NaN都会将无序与包括其自身在内的所有事物进行比较。 ...

无序意味着完全显示在同一部分的表4中。但简而言之,这意味着如果任何操作数是NaN,则比较将返回false,除了 WITH events2(id, row,event, code) AS ( VALUES (1,1, 0, 0 ) ,(1,2, 0, 0 ) ,(1,3, 1, 0 ) ,(1,4, 0, 1 ) -- notice the switch here ,(1,5, 1, 1 ) -- ,(2,1, 0, 0 ) ,(2,2, 1, 0 ) ,(3,1, 0, 0 ) ,(3,2, 0, 0 ) ) select * from events2 将返回true。

答案 1 :(得分:2)

在这种情况下,您看到的0意味着false,因为默认情况下,流显示为false。如果您希望将其视为truefalse,请使用std::boolalpha

std::cout << std::boolalpha << (a > b) << std::endl;

乳清比较其中一个值为nan的浮点值,然后x<yx>yx<=yx>=yx==y将全部评估为是的,而x!=y将永远是真的。 Andrew Koenig在Dr Dobbs网站上发表了一篇很好的文章。

当你考虑它时,结果不能是nan,因为比较运算符需要返回一个只能有2个状态的布尔值。

答案 2 :(得分:1)

0这里的意思是假的。 Nan与任何值不相等或不相同,因此操作结果为false(0)。

答案 3 :(得分:0)

Well, on top of @user2079303 pretty good answer, there are two NaNs: quiet NaN and signaling NaN. You could check std::numeric_limits<T>::has_signaling_NaN on your platform is signaling NaN is available. If it is true and value contains std::numeric_limits<T>::signaling_NaN, then

When a signaling NaN is used as an argument to an arithmetic expression, the appropriate floating-point exception may be raised and the NaN is "quieted", that is, the expression returns a quiet NaN.

To really get FP exception you might want to set FPU control word (for x87 unit) or MXCSR register (for SSE2+ unit). This is true for x86/x64 platform, check your platform docs for similar functionality