В тесном цикле я делаю линейную интерполяцию между двумя значениями с плавающей запятой. Однако единственной необходимой частью результата является знак (будь то результат отрицательный или положительный). Я делаю типичную операцию lerp прямо сейчас, f между a и b.
a + f * (b - a);
Есть ли что-то более эффективное, учитывая, что мне просто нужно знать результирующий знак, а не фактическое значение lerped?
Изменить: «F» представляет собой набор фиксированных расстояний вдоль интерполяции, которые известны заранее.
Вы можете вычислить, меняет ли интерполированное значение знак в заданном диапазоне:
if Sign(a) <> Sign(b) then //don't forget about zero sign
change occurs
В этом случае найти f
параметр, где lerp = 0
a + f0 * (b - a) = 0
f0 = a / (a+b)
Для меньших значений lerp
имеет тот же знак, что и a
для большего — такой же знак, как b
так что вам не нужно рассчитывать lerp
ценность — просто сравнить f
с f0
Других решений пока нет …