2016-04-11 17 views
1

In einer engen Schleife mache ich eine lineare Interpolation zwischen zwei Fließkommawerten. Der einzige notwendige Teil des Ergebnisses ist jedoch das Vorzeichen (ob das Ergebnis negativ oder positiv ist). Ich mache gerade eine typische Lerp-Operation zwischen a und b.Lineare Interpolationsoptimierung für Sign-

a + f * (b - a); 

Gibt es etwas effizienter bedenkt, dass ich brauche nur das resultierende Zeichen kennen und nicht der tatsächliche Wert lerped?

Edit: 'f' ist ein Satz fester Abstände entlang der Interpolation, die vorher bekannt sind.

+2

Als allgemeine Faustregel gelten Berechnungen schneller als Zweige (z. 'if'-Aussagen). Dein Lerp-Code ist optimal imho. –

+1

Gibt es einen der Parameter a, b, f, der konstant ist? –

+0

Als Q & D-Hack können Sie das Vorzeichenbit als MSB in der IEEE-Darstellung erhalten. Dies erspart einen Test. Wie auch immer, es sei denn, der Körper des If ist wirklich leicht, jede Mikrooptimierung, die Sie hier machen können, wird unbemerkt bleiben. –

Antwort

2

können Sie, ob interpoliert Wertänderungen bei gegebenen Bereich unterzeichnen berechnen:

if Sign(a) <> Sign(b) then //don't forget about zero sign 
    change occurs 

In diesem Fall f Parameter, wo lerp = 0

a + f0 * (b - a) = 0 
f0 = a/(a+b) 

Für kleinere Werte lerp das gleiche Vorzeichen wie a hat, für größere - das gleiche Zeichen wie b, so müssen Sie lerp Wert nicht berechnen - vergleichen Sie einfach f mit f0

+1

Sie handeln eine Multiplikation für eine Division. Das ist keine gute Idee. –

+0

@ Yves Daoust Ich betrachte das typische Szenario des vorherbestimmten 'a, b' und die Bewertung von lerp in einigen Punkten. Das Wurzelfinden ist also eine einmalige Operation. Dann wird jedes benötigte 'f' mit' f0' verglichen. – MBo

+0

Solange das OP nicht gesagt hat, dass 'f' konstant ist, kann man es nicht annehmen. –