Предположим, у меня три числа. Два из них образуют диапазон между ними. Последний номер, я хочу проверить, попадает ли он в этот диапазон. Это простое предостережение: цифры, определяющие начало и конец диапазона, могут быть больше или меньше, чем другие. Это для алгоритма физики, производительность которого я стараюсь улучшить, поэтому я также хочу избежать использования условных операторов.Самый лаконичный способ проверки, если число падает между двумя другими номерами?
double inRange(double point, double rangeStart, double rangeEnd){
// returns true if the 'point' lies within the range
// the 'range' is every number between 'rangeStart' and 'rangeEnd'
// rangeStart can be greater than or less than rangeEnd
// conditional branches should be avoided
return ?; // return values [0.0 - 1.0] are considered 'in range'
}
Есть ли математическое уравнение для достижения этого, не используя логику состояния?
редактировать:
Причина возвращает двойной вместо BOOL, потому, что мне нужно знать соотношение тоже; 0.0 ближе всего к одному ребру, а 1.0 ближе всего к другому.
Оригинальный алгоритм у меня есть это:
double inRange(double point, double rangeStart, double rangeEnd){
if(rangeStart > rangeEnd){
double temp = rangeStart;
rangeStart = rangeEnd;
rangeEnd = temp;
}
return (point - rangeStart)/(rangeEnd - rangeStart);
}
Мой профайлер показывает около 16% времени программа работает, расходуется в этой функции, с оптимизацией включены. Это называется довольно часто. Не уверен, что условие условие полностью виноват, но я хотел бы попробовать функцию, которая не имеет одного и видеть.
Почему он возвращает 'double'? – Barry
Почему, по вашему мнению, условное утверждение замедляет его? –
Барри - Мне нужно знать соотношение в пределах диапазона. 0.0 ближе всего к rangeStart, а 1.0 ближе всего к диапазонуEnd –