作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
=1.0) { -6ren">
我对这个问题很困惑。我正在运行的代码是:
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() 函数输出时却不会。我做错了什么?
最佳答案
我假设 A
和 B
是归一化 vector ,因此您期望 dot(A, B)
将在 -1
和 1
。对于 float 学,这不一定是正确的。 |dot(A, B)|
可以略大于 1
。我敢打赌,如果您以更高的精度打印它,您会发现您的值略小于 -1
。
因此,您需要将 dot(A, B)
夹在 -1
和 1
之间。或者甚至更好,如果输入介于 -1
和 1
之间,则仅调用 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/
我创建了一个分支来开发新功能。由于这个新功能完全是作为一个新项目开发的,唯一可能的冲突来源是解决方案文件。 随着功能的开发,主分支更新了几次。当我完成开发和测试时,我做了: git checkout
我是一名优秀的程序员,十分优秀!