C++ 如何处理计算acos/sin/atan2时出现的奇怪错误?

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

有人在处理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 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;或者诸如此类的。你们太棒了!!!南造成了所有的麻烦!!我过去经常看到英文的错误消息,并处理它。但不是这样。谢谢大家抽出时间!