将临时的64位变量存储在32位计算机中

时间:2019-06-15 08:19:59

标签: c 32bit-64bit 32-bit

我正在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)溢出。 我尝试了几件事:

  1. 在将Vector3组件发送到此函数之前对其进行位移位 减小尺寸。在大多数情况下都可以使用,但是我却失去了精确度 这使得算法在某些情况下会失败。
  2. 将运算结果存储在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?

1 个答案:

答案 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;