我不确定为什么下面的代码不起作用,我试图在数组中找到NaN的值然后将NaN移动到数组中的第一个元素(元素0)并交换现有元素0无论NaN在哪里。请问我能检查一下我的代码吗?也许你们/女孩可以看到我不能做的事情?
提前致谢!
#define NaN (float)(1e308*10*0)
void movenan(float array[], int size)
{
int w;
float hold;
float move;
for(w = 0; w < SIZE - 1; w++)
{
if(array[w] == NaN)
{
hold = array[w];
array[w] = array[0];
array[0] = hold;
}
}
}
答案 0 :(得分:6)
您的NaN检查错误:NaN不会与任何内容进行比较,包括他们自己。
使用isnan()
检查值是否为NaN。
如果isnan()
不可用,则检查f
是否为NaN的规范方法如下:f != f
。如果f
为NaN,则评估结果为真。
这里有更多的信息:Checking if a double (or float) is NaN in C++(问题是关于C ++,但也有很多关于C的信息。)
最后,for
循环的终端条件看起来很可疑。您的意思是< SIZE
还是<= SIZE-1
?
答案 1 :(得分:2)
我怀疑问题是你的纳米比较。 NaNs不是那么一致。
您应该使用isnan()
函数或其中一个变体。如果您不想出于某种愚蠢的原因而使用isnan,那么检查nan的最简单方法是if(array[w] != array[w])
。使用真正的NAN,这应该可行,假设你的优化器没有把它拿出来。
你在那个循环中也是一个人(应该是w < size
,SIZE
可能是其他东西,你不想去size-1
)
答案 2 :(得分:0)
如果你试图解析整个数组,那么条件就应该
是w<size
否则它只解析到倒数第二个元素。