检查数字是否介于两个其他数字之间的最简洁方法?

时间:2013-04-06 21:43:16

标签: c++ math optimization

假设我有三个数字。其中两个形成了它们之间的范围。最后一个号码,我想查看它是否在该范围内。这是一个简单的警告:定义范围开始和结束的数字可能大于或小于另一个。这是一个物理算法,其性能我正在努力改进,所以我也想避免使用条件语句。

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%的时间,在此功能中使用,并启用了优化。它经常被称为。不确定条件语句是否完全是责备,但我想尝试一个没有一个并且看到的函数。

2 个答案:

答案 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)

如果开头大于结尾,则交换那些。