我正在32位计算机上进行一些编程。 作为计算3d对象之间碰撞的算法的一部分,我必须获得点积的结果:
//Vector3 components are signed int
signed long GaMhVecDotL(const Vector3 *p_a, const Vector3 *p_b)
{
return ((p_a->vx * p_b->vx + p_a->vy * p_b->vy + p_a->vz * p_b->vz));
}
在某些情况下,此结果会使32位返回值(signed long
)溢出。
我尝试了几件事:
long long
变量中,
虽然可以编译,但似乎不存储变量
正确(这是针对某些PSX自制软件,自90年代末以来就没有更新过编译器和工具)。我实际上不需要知道点积的全部结果,我只需要知道结果是正数,负数还是0,同时尝试保持尽可能高的精度
。有什么方法可以将操作结果(p_a->vx * p_b->vx + p_a->vy * p_b->vy + p_a->vz * p_b->vz
)存储在temp 64位var(或2x32位)中,以便以后可以检查此var是正,负还是0?
答案 0 :(得分:3)
有什么方法可以将操作
(p_a->vx * p_b->vx + p_a->vy * p_b->vy + p_a->vz * p_b->vz)
的结果存储在64位临时var(或2x32位)中,以后让我检查该var是正,负还是0? >
这使用32位数学运算(给定int为32位)。将返回值存储在64位结果中不会使方程式成为64位。
// 32-bit math
p_a->vx * p_b->vx + p_a->vy * p_b->vy + p_a->vz * p_b->vz
在方程式中使用64位数学运算。
// v-----------------v multiplication now done as 64-bit
long long dot = (1LL*p_a->vx*p_b->vx) + (1LL*p_a->vy*p_b->vy) + (1LL*p_a->vz*p_b->vz);
然后检查签名
if (dot < 0) return -1;
return dot > 0;