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

标签 c++ exception math angle

有没有人在处理 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 变量存储了这个疯狂的值。

有什么好主意吗?

提前谢谢你..

最佳答案

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

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

你确定公式正确吗?


如果要捕获 NaN,则 NaN 需要是信号 NaN。对于 gcc,使用 -fsignaling-nans 选项进行编译。

关于c++ - 如何处理计算 acos/sin/atan2 时出现的奇怪错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2513897/

相关文章:

c++ - 我什么时候应该使用 VULKAN_HPP_NO_EXCEPTIONS?

java - 如何启用日志返回日志堆栈跟踪和未捕获的异常

c++ - 检查鼠标是否在三角形 C++ 内

带有形状体积和面积类的 Java 接口(interface)

c++ - 比较两个原子整数 Qt5

c++ - 在 C++ 中读入值并存储在列表中

java - Java-ArrayOutOfBoundsException帮助我

python 3轮函数逼近

c++ - OpenMP 第一个内核比第二个内核慢得多

c++ - 在 incredibuild 中启用 Microsoft Visual Studio x64 工具