我有一个经典的练习,要求我检查角色是否从背面(背刺或弹丸)受到攻击。我知道我可以为此使用点积,我只是想知道是否必须先对向量进行规范化,或者这没关系。
我的推论是向量坐标是否为大数,是否会导致点积上溢或下溢。
float dotProd(Vector3& P, Vector3& Q)
{
return P.x * Q.x + P.y * Q.y + P.z * Q.z;
}
bool sneakAttack(Vector3& proj, Vector3& player)
{
if(dotProd(proj, player) > 0)
return true;
else
return false;
}
没错,原则上有些坐标可能太大,以至于点积计算会溢出。
但是,有限的32位浮点数的可表示范围非常大,最大值约为3×10 ^ 38(Wikipedia)。例如,假设您的向量以厘米为单位,这足以计算从冥王星延伸到太阳的向量的点积(距离约为6×10 ^ 14 cm),而仍然不会接近溢出。按照“您将不需要它”(YAGNI)的原则,除非要特别知道某些输入实际上具有星际幅度,否则不值得编写例程来处理大于此的输入。另外,规范化会增加运行时成本,所以我说除非实际必要,否则最好不要这样做。
广义上讲,几乎所有对浮点数或整数进行算术运算的软件在极端情况下都可能会溢出。如果必须在每个操作周围都考虑溢出错误处理,这将是沉重的负担。取而代之的是,通常会在开发软件时考虑输入保持在合理范围内,而无需正式证明支持的范围或处理超出范围的输入,除非应用程序要求这样做。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句