假设我有三个数字。其中两个形成了它们之间的范围。最后一个号码,我想查看它是否在该范围内。这是一个简单的警告:定义范围开始和结束的数字可能大于或小于另一个。这是一个物理算法,其性能我正在努力改进,所以我也想避免使用条件语句。
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'
}
是否有一个数学方程可以实现这一点,而不使用条件逻辑?
编辑:
它返回double而不是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%的时间,在此功能中使用,并启用了优化。它经常被称为。不确定条件语句是否完全是责备,但我想尝试一个没有一个并且看到的函数。
答案 0 :(得分:3)
回答你的规范“接近开始时它应该返回0,接近结束时应该返回1”,你不需要条件,并且可以交换开始和结束:
return (point-std::min(rangeStart, rangeEnd))/std::abs(rangeStart - rangeEnd);
请注意,虽然我不知道特定的STL实现,但min
并不一定要求实现条件。例如,min(a,b)=(a + b-abs(b-a))/ 2。
答案 1 :(得分:2)
如果开头大于结尾,则交换那些。