【问题标题】:How can I handle weird errors from calculating acos / sin / atan2?如何处理计算 acos / sin / atan2 的奇怪错误?
【发布时间】:2010-03-25 08:14:49
【问题描述】:

有没有人在处理 sin / cos/ tan / acos.. 数学东西时看到这个奇怪的值?

===奇怪的价值===

-1.#IND00

======================

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 存储到 theta_one 和 theta_two 中

它看起来既不是字符也不是数字:(

毫无疑问,atan2 / acos / stuff 是问题所在。

但问题是,try and catch 也不起作用 因为那些双变量已成功存储 其中的一些值

此外,以下计算从不抱怨它 并且永远不要破坏程序

我正在考虑以某种方式强制使用此值并使整个程序崩溃... 这样我就可以捕捉到这个错误..

除了那个想法,我不知道我应该如何检查这些是否 theta_one 和 theta_two 变量存储了这个疯狂的值。

有什么好主意吗?

提前谢谢你..

【问题讨论】:

  • 嗯?在C中不允许吗? - (我更喜欢 C++。)
  • trycatch 也是 C++,而不是 C。
  • 您的意见是什么?您如何打印“奇怪”的值?看起来这可能是负无穷大的表示。
  • 如果你改用指针会发生什么?还是错误的结果?
  • 嗯...不走运。仍然得到“-1.#IND000000000000”值..

标签: c++ exception math angle


【解决方案1】:

“奇怪的值”是NaN(不是数字)。

问题是因为(L2*L2 - B*B - L1*L1) / (-2*B*L1) = 6.08112… 超出了 [-1, 1] 范围,其中 acos 是为实数明确定义的。所以返回的是 NaN。

你确定公式正确吗?


如果你想捕捉一个 NaN,这个 NaN 需要是一个信号 NaN。对于 gcc,使用 -fsignaling-nans 选项进行编译。

【讨论】:

  • 好答案,我在您可能认为输入值介于 -1 和 1 之间但实际上大于 1 的最小位(由于舍入误差)。您需要先计算数字然后将其强制进入范围,然后再将其传递给 acos。例如:双xx =(L2 * L2 ...);如果 (xx >= 1) xx = 0.9999999999;或类似的东西。
  • 你们摇滚!!! NaN 造成了所有的麻烦!我曾经在英语中看到 NaN 错误消息并进行了处理。但不是这样。感谢大家的宝贵时间!
猜你喜欢
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 2021-04-02
相关资源
最近更新 更多