【发布时间】:2019-10-29 17:04:10
【问题描述】:
我正在 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)。
我尝试了几件事:
- 在将 Vector3 组件发送到此函数之前对其进行位移 以减小尺寸。这在大多数情况下都有效,但我失去了精度和 这使得算法在某些边缘情况下失败。
- 将运算结果存储在
long long变量中, 虽然它编译它似乎并没有存储变量 正确(这是针对某些 PSX 自制软件,编译器和工具自 90 年代后期以来未更新)。
我实际上不需要知道点积的完整结果,我只需要知道结果是正数、负数还是 0,同时尽量保持精度.
有什么方法可以将该操作的结果 (p_a->vx * p_b->vx + p_a->vy * p_b->vy + p_a->vz * p_b->vz) 存储在一个临时 64 位 var(或 2x32 位)中,以便我稍后检查该 var 是正数、负数还是 0?
【问题讨论】:
-
"我已经尝试了几件事" - 然后请显示您尝试过的实际代码,而不仅仅是对您认为您尝试过的内容的模糊描述。我们无法调试释义。
标签: c 32bit-64bit 32-bit