2016-04-25 5 views
1

Ich habe einen Schwimmer, der einen beliebigen Wert auf der positiven oder negativen Skala haben kann.Ich brauche einen eleganten Weg, um einen Skalar (Art von) zu normalisieren

Wenn der Float kleiner als 1 oder größer als -1 UND nicht 0 ist, muss er auf 1 oder -1 gerundet werden.

Ich habe eine Funktion, die ich gemacht habe, die den Trick tut, aber ich habe das Gefühl, es gibt eine elegante inline mathy Art, dies zu tun, aber ich kann nicht mit einem kommen.

[MethodImpl(MethodImplOptions.AggressiveInlining)] 
public static float NormalizeScalar(float input) 
{ 
    if ((input > -1) && (input < 1)) 
     return (input == 0) ? 0 : (input < 0) ? -1 : 1; 
    return input; 
} 

Irgendwelche Vorschläge?

Antwort

3

Verwenden Sie Math.Sign(input).

Wenn Sie Ihre Eingabe ist 0,78 -> 1 zurück

Wenn es 0 -> 0 zurück

Wenn es -0.78 ist -> -1 zurück.

+0

Perfekt und elegant. Gute Arbeit, um das Rad nicht neu zu erfinden. –

+1

Dies wird tatsächlich einen Skalar "normalisieren". Für meine Lösung kann ich ** verwenden (Math.Abs ​​(Eingabe)> 1? Eingabe: Math.Sign (Eingabe)) **, die die Leistung nicht weiter zu beeinträchtigen scheint. Für alle, die an den Benchmarks interessiert sind, die ich gelaufen bin, könnt ihr sie [hier] finden (http://pastebin.com/v8Wstvu3). Die Ergebnisse: 1: ** 350 **, 2: ** 400 **, 3: ** 400 **, was zeigt, dass es nur geringfügig langsamer war, den eleganteren Ansatz zu verwenden. Vielen Dank! – WHol

Verwandte Themen