-1

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

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% 的时间都花在了这个函数上,并启用了优化。它经常被调用。不确定条件语句是否完全归咎于,但我想尝试一个没有的函数,看看。

4

2 回答 2

3

回答你的规范“它应该在接近开始时返回零,在接近结束时返回 1”,你不想要条件,并且开始和结束可能会被交换:

return (point-std::min(rangeStart, rangeEnd))/std::abs(rangeStart - rangeEnd);

请注意,虽然我不知道特定的 STL 实现,min但不一定需要实现条件。例如,min(a,b) = (a+b-abs(ba))/2。

于 2013-04-06T21:49:57.683 回答
2

如果开始大于结束,则交换它们。

于 2013-04-06T21:45:09.237 回答