我想计算两个3d矢量之间的角度。我使用以下等式(source of equation)来实现这一目标:
diffangle = atan2(norm(cross(v1,v2)),dot(v1,v2))
v1和v2的组件在数据类型float中给出,但由于我的角度很小,我希望在double类型中有不同的角度。我的实际实现如下:
double angle(float x1, float y1, float z1, float x2, float y2, float z2)
{
double dot = x1*x2 + y1*y2 + z1*z2;
double crossX = y1*z2-z1*y2;
double crossY = z1*x2-x1*z2;
double crossZ = x1*y2-y1*x2;
double norm = sqrt(crossX*crossX+crossY*crossY+crossZ*crossZ);
return (atan2(norm,dot)/M_PI*180);
}
我的实施是应该做什么或者我必须考虑某事或考虑其他因素?
感谢您的帮助。
答案 0 :(得分:1)
关于准确性的问题:在C(和C ++)中,当参与计算的双重时,浮点数将被提升为加倍(从int到long int的提升相同)。
所以表达式
double z = x*y;
首先以单精度(x*y
)计算float
,然后将结果转换为double
。要使用双精度实际执行计算,您需要转换表达式中涉及的一个元素:
double z = (double)x*y;
然而,最简单的解决方案是将函数声明更改为接受double
。这样,调用函数时将提升float
值,并且所有计算都将使用双精度。