为什么 acos() 在使用点积的结果时会导致"nan(ind)"?

Why is acos() resulting in "nan(ind)" when using the result of a dot product?

本文关键字:ind nan acos 为什么 结果      更新时间:2023-10-16

我对这个问题很困惑。我正在运行的代码是:

double dotProduct = dot(A, B);
std::cout << dotProduct << std::endl;
theta = acos(dotProduct);
std::cout << theta << std::endl;

其输出为

-1
ANGLE: -nan(ind)

但是,以下工作:

double dotProduct = dot(A, B);
std::cout << dotProduct << std::endl;
dotProduct = -1;
theta = acos(dotProduct);

给出输出:

-1
ANGLE: 3.14159

另外,如果我将 dotProduct 转换为浮点数,acos(( 会正确输出角度:

double dotProduct = dot(A, B);
std::cout << dotProduct << std::endl;
theta = acos((float) dotProduct);

还导致输出

-1
ANGLE: 3.14159

对于dot((函数,我使用的是犰狳库。我不明白的是为什么 acos(( 在我设置 dotProduct = -1 时应该工作,但在 dot(( 函数输出时不会。我做错了什么?

我想AB是规范化的向量,因此您期望dot(A, B)介于-11之间。对于浮点数学,这不一定是正确的。|dot(A, B)|可以略大于1。我敢打赌,如果你以更高的精度打印它,你会发现你的值略小于-1

因此,您需要在-11之间夹紧dot(A, B)。或者更好的是,如果输入在-11之间,则仅调用acos()

double safe_acos(double value) {
if (value<=-1.0) {
return <pi>;
} else if (value>=1.0) {
return 0;
} else {
return acos(value);
}
}

这可能会稍微快一些,因为您可以避免为越界值调用acos()

注意:如果您进行 3D 数学运算,则很有可能完全避免调用acos()。使用三角恒等式,通常我们可以用更快、更准确的解决方案来替换它。