=1.0) { -6ren">
gpt4 book ai didi

c++ - 为什么 acos() 在使用点积的结果时会产生 "nan(ind)"?

转载 作者:搜寻专家 更新时间:2023-10-31 02:05:23 24 4
gpt4 key购买 nike

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

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 转换为 float ,acos() 会正确输出角度:

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

也导致输出

-1
ANGLE: 3.14159

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

最佳答案

我假设 AB 是归一化 vector ,因此您期望 dot(A, B) 将在 -11。对于 float 学,这不一定是正确的。 |dot(A, B)| 可以略大于 1。我敢打赌,如果您以更高的精度打印它,您会发现您的值略小于 -1

因此,您需要将 dot(A, B) 夹在 -11 之间。或者甚至更好,如果输入介于 -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()。使用三角恒等式,通常我们可以用更快、更准确的解决方案代替它。

关于c++ - 为什么 acos() 在使用点积的结果时会产生 "nan(ind)"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52138147/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com