
NaN = Not a Number 一般出现这个东西的原因有两个
1)你的程序里出现0作为分母的运算,这个时候可以考虑把被除矩阵整体加一个无限小量,例如1e-10。这样可以消除0作分母的现象。
2)如果上面这个做法不管用,一般就是你自己的算法和编程的问题了,导致结果不收敛,发散。多次迭代后无穷大,超过了matlab允许的数值范围。这个时候你必须去仔细检查你的程序了。
希望能帮到你啊!~
32位浮点数在机器中的表示按照IEEE的标准是这样的:+------+----------------+-------------------------------+
| 1bit| 8bit | 23bit|
+------+----------------+-------------------------------+
其中:1bit表示符号位(0表示正,1表示负),8bit表示指数(0~255,实际指数取值还要减去127,即指数取值区间为-127~128),23bit表示尾数。
这里所要说的浮点异常值就是这种表示产生的几种特殊值,IEEE规定根据指数和尾数的不同分别可表示如下几种特殊值:
1. 零值:按上述的浮点表述形式如果指数部分全部为0,并且尾数全部为0,则表示为浮点0.0,并且规定-0 = +0
2. 非规格化值:如果指数全部为0,尾数非0,则表示非规格化的值,16进制看到的就是[80xxxxxx]h或者[00xxxxxx]h
3. 无穷值:如果指数全部为1,尾数全部为0,则根据符号位分别表示正无穷大和负无穷大,16进制看到的就是[FF800000]h或者[7F800000]h
4. NAN:主角来了,如果指数全部为1,尾数非0,则表示这个值不是一个真正的值(Not A Number)。NAN又分成两类:QNAN(Quiet NAN)和SNAN(Singaling NAN)。QNAN与SNAN的不同之处在于,QNAN的尾数部分最高位定义为1,SNAN最高位定义为0;QNAN一般表示未定义的算术运算结果,最常见的莫过于除0运算;SNAN一般被用于标记未初始化的值,以此来捕获异常。
那么既然NAN不是一个真实的数值,在程序如何判断变量是否变成了NAN呢?大部分语言中针对NAN值都有一系列的函数定义,C语言中最常见的三个函数:
_isnan(double x) //判断是否为NAN
_finite(double x) //判读是否为无穷大
_fpclass(double x) //返回一系列的定义值,如:_FPCLASS_QNAN, _FPCLASS_SNAN,具体参考MSDN
对于上面的程序
unsigned long nan[2]={0xffffffff, 0x7fffffff}
定义一个64位的空间,内容为0x7fffffffffff,最高符号位为 0,其它位全为1,细分NAN的话,就是上面的QNAN。
然后转化为double,
*(double*)nan这里nan为数组名,实际值为数组地址,先转化为(double*)指针,再取值*(double*)
至于要这样写,而不是直接double a = 0x7fffffffffff是为了不让编译器转化整形值0x7fffffffffff到浮点型(按IEEE 754定义的格式存储)。
这里直接分配64位空间,然后写好值,直接告诉编译器,这个地方的数据是double,以后程序再访问这个double值,发现它的内容是0x7fffffffffff,程序就知道这个是NaN了
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)