Хранить временную 64-битную переменную на 32-битной машине - PullRequest
0 голосов
/ 15 июня 2019

Я занимаюсь программированием на 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-х).

Мне на самом деле не нужно знать полный результат 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?

1 Ответ

3 голосов
/ 15 июня 2019

Можно ли как-нибудь сохранить результат этой операции (p_a->vx * p_b->vx + p_a->vy * p_b->vy + p_a->vz * p_b->vz) во временной 64-битной переменной (или 2x32 бита), что позже позволило бы мне проверить, является ли эта переменная положительной, отрицательной или 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...