Я занимаюсь программированием на 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-х).
Мне на самом деле не нужно знать полный результат Dot Product, Мне просто нужно знать, положительный результат, отрицательный или 0 и прив то же время пытаясь сохранить как можно большую точность.
Можно ли как-нибудь сохранить результат этой операции (p_a->vx * p_b->vx + p_a->vy * p_b->vy + p_a->vz * p_b->vz
) во временной 64-битной переменной (или 2x32 битах), котораяПозвольте мне позже проверить, является ли этот var положительным, отрицательным или 0?