最简洁的检查一个数是否落在其他两个数之间的方法

Most concise way of checking if a number falls betwen two other numbers?

本文关键字:其他 两个 方法 之间 一个 检查 简洁 是否      更新时间:2023-10-16

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

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,接近结束时应返回1 ",您不需要条件,并且开始和结束可能被交换:

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

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

如果开始部分大于结束部分,则将它们交换