问题:
今天看了一下昨天跑的重建程序。后面写的float数组值,全部是nan。估计重建算法或者数据源有点问题
可能是因为你对变量赋了过大的值导致其溢出,出现输出Nan。试着把你的仿真的值缩小n倍。比如y(1:10000)=0.5*y(1:10000);
网上搜到解释:
2位浮点数在机器中的表示按照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
参考:
1、http://www.cnblogs.com/konlil/archive/2011/07/06/2099646.html
2、http://stackoverflow.com/questions/570669/checking-if-a-double-or-float-is-nan-in-c