2012-03-31 2 views
1

Ich habe einen 3-Vektor, sagen wir mal,Günstigste Weise, Max() auf absolute Werte zu tun, aber Max() beibehalten Zeichen?

v = vec3(-4, 2, 3) 

Ich möchte eine max auf die absoluten Werte der Komponenten tun, so das Äquivalent von:

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

Ich habe jedoch ein Voraussetzung, dass ich das Zeichen bewahren muss. So zum Beispiel:

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

Es ist ein triviales Problem, wenn ich bedingte Verzweigung verwenden, aber ich versuche, dies in möglichst wenige Operationen wie möglich zu tun, und vermeiden Verzweigung. Irgendwelche Ideen, wo Sie suchen? Vielleicht gibt es ein bisschen Verschiebung Magie, die getan werden kann?

+1

Können Sie solche Low-Level-Optimierungen nicht dem Compiler überlassen? –

+0

@BasileStarynkevitch Ich traue meinem Compiler nicht, ihn zu optimieren. Es ist ein GLSL-Bytecode-Compiler, der direkt auf meine GPU geht, und leider habe ich keinen Zugriff auf ein Zwischenformat (wie die Assembly), um zu sehen, was es macht. – amoffat

+1

Was machst du im Fall 'vec3 (4, 0, -4)' ?? –

Antwort

1

Ich würde die max und die min aller Werte bestim, und dann entscheiden, was abs größer

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

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

Wenn Sie das Zeichen erhalten möchten, mit einer if

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

Was aber soll (0, 0, 0) passieren? kein Zeichen?

+0

Sehr schlau. Ich werde immer noch eine Bedingung machen müssen, um den endgültigen Wert zu bestimmen, aber ich denke, das ist so gut wie es geht. Vielen Dank! – amoffat

+0

Sie sollten das if ändern, um nach 'mi <-ma' zu suchen, sonst kommen wir zu unnötigen Problemen, wenn 'mi = -2 ** (wordsize-1) ' – Voo