转载自此文章
最近在调查问题的时候,发现了一个double类型在打印时出现nan。在解决完后随手记下笔记。
1、什么是nan
nan的意思是“Not a Number”,不是一个数值,或者无法表示的数值。
2、为什么会出现nan
主要有一下几点:
a. 对负数开方
b. 对负数求对数,如:log(-1.0)
c. 0为分母, 如3.0/0.0
d. 未对double类型初始化,使用的时候就是nan
我遇到的就是最后一种,未对double类型初始化,其在内存里的存值就是一个nan, 在之后的计算过程中返回的结果也都是nan。
官方的说法:
An uninitialised floating point value could be anything at all; it could hold some representation of NaN (there are a very large number of possible bit patterns that can represent NaN).
比如:
double a; //假如a此时在栈空间的存储就是无法表示的数值,其之后的运算结果也为nan
double b = a * 0.0; //由于a为nan,b的结果也会为nan
3、nan的判断
可以使用isnan函数检测一个数值是否为nan
int isnan(x); //当x时nan返回1,其它返回0;
还可以使用unsigned long long 类型的指针指向double类型变量,打印其在内存的存储数值。
unsigned long long* c = &a;
prinf(“0x%llx \n”,*c);
打印结果为:
0xffffffff0000ffff
此数值会被认为一个无法表示的数值
printf(“%lf \n”, 0xffffffff0000ffff);
输出结果为 nan
————————————————
版权声明:本文为CSDN博主「我又不会乱来」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hybohehe/article/details/121478243