C++ 如何处理计算acos/sin/atan2时出现的奇怪错误?
有人在处理sin/cos/tan/acos时看到过这个奇怪的值吗。。数学的东西 ==奇怪的值=== -1.00 =====================C++ 如何处理计算acos/sin/atan2时出现的奇怪错误?,c++,exception,math,angle,C++,Exception,Math,Angle,有人在处理sin/cos/tan/acos时看到过这个奇怪的值吗。。数学的东西 ==奇怪的值=== -1.00 ===================== void inverse_pos(double x, double y, double& theta_one, double& theta_two) { // Assume that L1 = 350 and L2 = 250 double B = sqrt(x*x + y*y); double
void inverse_pos(double x, double y, double& theta_one, double& theta_two)
{
// Assume that L1 = 350 and L2 = 250
double B = sqrt(x*x + y*y);
double angle_beta = atan2(y, x);
double angle_alpha = acos((L2*L2 - B*B - L1*L1) / (-2*B*L1));
theta_one = angle_beta + angle_alpha;
theta_two = atan2((y-L1*sin(theta_one)), (x-L1*cos(theta_one)));
}
这是我正在编写的代码
在特定条件下,如x和y为10和10,
此代码将-1.IND00存储到θ1和θ2中
它看起来既不像字符也不像数字:
毫无疑问,atan2/acos/stuff就是问题所在
但问题是,尝试和抓住也不起作用
因为这些双变量已成功存储
其中有一些价值
此外,以下计算从不抱怨它
永远不要破坏程序
我正在考虑以某种方式强制使用这个值,使整个程序崩溃。。。
这样我就能抓住这个错误
除了这个想法,我不知道该如何检查这些
θ1和θ2变量存储了这些疯狂的值
有什么好主意吗
提前谢谢。奇怪的值不是数字
问题是因为L2*L2-B*B-L1*L1/-2*B*L1=6.08112…超出了acos为实数定义的范围[-1,1]。于是楠回来了
你确定公式正确吗
如果你想抓住一个NaN,NaN必须是一个信号NaN。对于gcc,使用-fsignaling nans选项编译。奇怪的值不是数字
问题是因为L2*L2-B*B-L1*L1/-2*B*L1=6.08112…超出了acos为实数定义的范围[-1,1]。于是楠回来了
你确定公式正确吗
如果你想抓住一个NaN,NaN必须是一个信号NaN。对于gcc,使用-fsignaling nans选项编译。Huh?在C语言中是不允许的吗我更喜欢C++。尝试和抓取也是C++,而不是C。你的输入是什么?你怎么打印这个奇怪的值?看起来这可能是负无穷大的一种表示,那么如果你用指针来代替它会发生什么呢?还是错误的结果?嗯。。。不走运。仍然得到-1.IND000000000000的值..嗯?在C语言中是不允许的吗我更喜欢C++。尝试和抓取也是C++,而不是C。你的输入是什么?你怎么打印这个奇怪的值?看起来这可能是负无穷大的一种表示,那么如果你用指针来代替它会发生什么呢?还是错误的结果?嗯。。。不走运。仍然得到-1.IND000000000000值..回答得好,我在您可能认为输入值介于-1和1之间的情况下看到了这一点,但实际上由于舍入错误,输入值比1稍大一点。您需要先计算数字,然后将其强制进入范围,然后再将其传递给acos。例如:双xx=L2*L2。。。;如果xx>=1 xx=0.9999999;或者诸如此类的。你们太棒了!!!南造成了所有的麻烦!!我过去经常看到英文的错误消息,并处理它。但不是这样。谢谢大家抽出时间!回答得好,我在一些情况下见过这种情况,您可能认为输入值介于-1和1之间,但实际上由于舍入错误,输入值比1稍大一点。您需要先计算数字,然后将其强制进入范围,然后再将其传递给acos。例如:双xx=L2*L2。。。;如果xx>=1 xx=0.9999999;或者诸如此类的。你们太棒了!!!南造成了所有的麻烦!!我过去经常看到英文的错误消息,并处理它。但不是这样。谢谢大家抽出时间!