C++的NaN问题

来源:百度知道 编辑:UC知道 时间:2024/05/20 18:08:42
为什么0和0相乘出来会是-NaN(0x400000)那样的结果?
所有代码如下:
void initData()
{
for (int i=0;i<=order;i++)
{
D[i]=0;

for (int j=0;j<=order;j++)
V[i][j]=0;
}
}
float cov(int i,int j)
{
int n=i>j?i:j;
float co=0;
while (n<N)
{
co+=signal[n-i-1]*signal[n-j-1];
n++;
}
return co;
}
float getVij(int i,int j)
{
float sum=0;
for (int k=1;k<j;k++)
{
sum+=V[i][k]*D[k]*V[j][k];
}
V[i][j]=(cov(i,j)-sum)/D[j];
}
float getDi(int i)
{
float sum=0;
for (int k=1;k<i;k++)
sum+=V[i][k]*V[i][k]*D[k];
return cov(i,i)-sum;
}
int main()
{
initData();
for (int ii=0;ii<N;ii++)
signal[ii]=10*sin(PI*4/N*ii);
D[1]=cov(1,1);
fo

你可以把你的
sum+=V[i][k]*D[k]*V[j][k];
之前的V[i][k], D[k]和V[j][k]都print出来看看值是多少。

我估计也许你的初始化函数有问题,这样数组里面的值可能是垃圾值,不是可表示的浮点数都是有可能的。所以结果也就不正确了。

另:你的程序没有D和V数组的定义,不能编译。

NaN的二进制表示方式,如下:
e: all 1s
mantissa: != 0

再贴一段吧,讲得挺详细的:

NaN 用于处理计算中出现的错误情况,比如 0.0 除以 0.0 或者求负数的平方根。由上面的表中可以看出,对于单精度浮点数,NaN 表示为指数为 emax + 1 = 128(指数域全为 1),且尾数域不等于零的浮点数。IEEE 标准没有要求具体的尾数域,所以 NaN 实际上不是一个,而是一族。不同的实现可以自由选择尾数域的值来表达 NaN,比如 Java 中的常量 Float.NaN 的浮点数可能表达为 01111111110000000000000000000000,其中尾数域的第一位为 1,其余均为 0(不计隐藏的一位),但这取决系统的硬件架构。Java 中甚至允许程序员自己构造具有特定位模式的 NaN 值(通过 Float.intBitsToFloat() 方法)。比如,程序员可以利用这种定制的 NaN 值中的特定位模式来表达某些诊断信息。
定制的 NaN 值,可以通过 Float.isNaN() 方法判定其为 NaN,但是它和 Float.NaN 常量却不相等。实际上,所有的 NaN 值都是无序的。数值比较操作符 <,<=,> 和 >= 在任一操作数为 NaN 时均返回 false。等于操作符 == 在任一操作数为 NaN 时均返回 false,即使是两个具有相同位模式的 NaN 也一样。而操作符 != 则当任一操作数为 NaN 时返回 true。这个规则的一个有趣的结果是 x!=x 当 x 为 NaN 时竟然为真。
可以产生 NaN 的操作如下所示:

(INF: 无穷大)

+: INF +