C exp()函数在不应返回nan时返回nan
下面是while循环中的一段代码,我使用exp()函数计算了一些概率。无论程序的输入是什么 在循环的第7次迭代中,exp返回nanC exp()函数在不应返回nan时返回nan,c,nan,C,Nan,下面是while循环中的一段代码,我使用exp()函数计算了一些概率。无论程序的输入是什么 在循环的第7次迭代中,exp返回nan if(new<=old){ coloring[random_node]=random_color; }else{ proba=exp((-(new-old))/temperature); /*assert(!isnan(proba));*/ printf("proba == %.50f\n",proba);
if(new<=old){
coloring[random_node]=random_color;
}else{
proba=exp((-(new-old))/temperature);
/*assert(!isnan(proba));*/
printf("proba == %.50f\n",proba);
if(random_percent(proba)){
coloring[random_node]=random_color;
}
}
在这两种情况下,使用的变量值完全相同。扎克的直觉是正确的。我的random_percent函数如下所示,未声明round()宏
int random_percent(double probability){
int edge=round(100*probability);
return ((rand () % 100) < edge) ? 1 : 0;
}
int随机百分比(双概率){
整数边=圆形(100*概率);
返回((rand()%100)
如果在GDB提示符下键入p((双(*)(双))exp)((新旧)/温度)
,情况是否会改变?如果是,您是否将#包括在内?(我闻到一种隐含的声明。)哦,如果这并没有揭示问题,那么试试valgrind
。这不是明显的内存损坏,但可能是细微的内存损坏。没有任何变化,我包括了数学library@Zack感谢您对隐式声明的建议。在random\u percent
函数中,我使用了一个未声明的round宏。@Zack我应该如何着手解决这个问题?这就是为什么应该禁用隐式声明。
int random_percent(double probability){
int edge=round(100*probability);
return ((rand () % 100) < edge) ? 1 : 0;
}