我有以下程序:
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}}如上例所示。
标准对此有何看法?
答案 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。如果您希望将其视为true
或false
,请使用std::boolalpha
:
std::cout << std::boolalpha << (a > b) << std::endl;
乳清比较其中一个值为nan的浮点值,然后x<y
,x>y
,x<=y
,x>=y
和x==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