我在这段代码中遇到了NaN错误:
void Robot::updatePos(int msTime){
if(vel_left==vel_right){
pos_x-=vel_right*msTime*0.001*sin(orientation);
pos_y-=vel_right*msTime*0.001*cos(orientation);
}
else{
int sign=1;
if(vel_left<vel_right) sign=-1;
float centre_x, centre_y;
float right_rad=width/(vel_left/vel_right-1);
centre_x=pos_x-cos(orientation)*(right_rad+width/2);
centre_y=pos_y-sin(orientation)*(right_rad+width/2);
cout << "centre" << centre_x << "right_rad" << right_rad << endl;
orientation+=sign*vel_right*msTime/right_rad;
pos_x=centre_x+cos(orientation)*(right_rad+width/2);
pos_y=centre_y+sin(orientation)*(right_rad+width/2);
}
while(orientation>M_PI) orientation-=2*M_PI;
while(orientation<-M_PI) orientation+=2*M_PI;
cout << "pos_x: " << pos_x << " pos_y: " << pos_y <<
" orientation: " << orientation << endl;
}
所有类变量都是浮点数。你知道可能导致这个错误的原因吗?
编辑:对不起,应该已经指定了。函数在一个循环中运行)我得到以下变量centre_x的NaN(在第一次通过循环ok然后是nan),pos_x,centre_y(在第一次通过循环ok然后是nan),pos_y,orientation。 right_rad = 0。显然问题出在“其他”部分。好的,缩小到直线:float right_rad = width /(vel_left / vel_right-1); 由于某种原因,结果是0。
问题解决了。非常感谢你们。
答案 0 :(得分:3)
如果right_rad
= 0,那么您将在此处除以零:
orientation+=sign*vel_right*msTime/right_rad;
除此之外,我看不出你有什么理由得到NaN。
答案 1 :(得分:0)
不幸的是,我没有足够的代表来发表评论,但是当您输入该功能时,orientation
的价值是多少?这似乎是NaN
所有变量的共同因素。如果您对尚未初始化的变量执行sin
或cos
,或者是无穷大或NaN ,你会得到NaN回来。