作者:缤纷之铃6868 | 来源:互联网 | 2023-07-28 19:14
经常在AS3里面收获到NaN,但一直认为C++是弱类型的,只管内存,再加上平时都跟uint32打交道比较多,才会在今天踩到陷阱。碰到一个值为-nan(0x400000)造成的cra
经常在AS3里面收获到NaN,但一直认为C++是弱类型的,只管内存,再加上平时都跟uint32打交道比较多,
才会在今天踩到陷阱。碰到一个值为-nan(0x400000)造成的crash.
google了一下收获到:
http://***.com/questions/570669/checking-if-a-double-or-float-is-nan-in-c
for a float f, f != f will be true only if f is NaN.
对于float类型变量f,f != f 仅在f 是 NaN时成立。
看来判断float是否为有效值是还得多一个判断f==f
直接看代码:
#include
int main(){
unsigned int i = 0x400000;
float f = 0.0f;
printf("{f:%f,i:%u}\n",f,i);
*((unsigned int *)&f)=i;
printf("{f:%f,i:%u}\n",f,i);
f = 0.0f/0.0f;
if(f != f)
printf("f != f,%f,%u\n",f,*((unsigned int *)&f));
if(f > 0.0f || f == 0.0f || f <0.0f)
printf(" f > 0.0f || f == 0.0f || f <0.0f)\n");
else
printf("cool!\n");
return 0;
}
补充一下c++的nan怎么出
#include
#include
void foo( double a, double b )
{
assert( a != b );
}
int main()
{
typedef std::numeric_limits<double> Info;
double const nan1 = Info::quiet_NaN();
double const nan2 = Info::quiet_NaN();
foo( nan1, nan2 );
}
原来,鱼非鱼啊