Самый дешевый способ сделать max () для абсолютных значений, но иметь знак max () для сохранения? - PullRequest
1 голос
/ 31 марта 2012

У меня есть 3 вектора, скажем,

v = vec3(-4, 2, 3)

Я бы хотел сделать максимум для абсолютных значений компонентов, поэтому эквивалент:

max(abs(v[0]), max(abs(v[1]), abs(v[2]))) == 4

Однако у меня есть требование, чтобы я сохранил знак. Так, например:

magic_max(v[0], magic_max(v[1], v[2])) == -4.

Это тривиальная проблема, если я использую условное ветвление, но я пытаюсь сделать это за минимально возможное количество операций и избежать ветвления. Есть идеи, где искать? Может быть, есть какое-то волшебство, способное сдвигать биты?

1 Ответ

1 голос
/ 31 марта 2012

Я бы определил максимальное и минимальное значения всех значений, а затем решил, что больше абс

ma = max(v[0], max(v[1], v[2]));
mi = min(v[0], min(v[1], v[2]));

res = abs(mi) > ma ? mi : ma;

Если вы хотите получить знак, замените последнюю строку на if

if (abs(mi) > ma) {
  sign = -1;
  res = mi;
} else {
  sign = +1;
  res = ma;
}

Однако, что должно произойти (0, 0, 0)?нет знака?

...