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

C++ 检查一个数字是否介于其他两个数字之间的最简洁的方法是什么?,c++,math,optimization,C++,Math,Optimization,假设我有三个数字。其中两个在它们之间形成一个范围。最后一个数字,我想看看它是否在这个范围内。这是一个简单的警告:定义范围开始和结束的数字可能大于或小于另一个。这是一个物理算法,我正在努力提高它的性能,所以我也希望避免使用条件语句 double inRange(double point, double rangeStart, double rangeEnd){ // returns true if the 'point' lies within the range // the '

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

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

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

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

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

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

为什么它返回
double
?为什么您认为条件语句会使它变慢?为什么没有条件逻辑?我猜是因为你觉得它很慢。在这种情况下,您将两个问题混为一谈:使代码正确,以及使其正确且快速。如果你没有第一步,就不要为第二步操心。那么到底是哪一个呢:你想知道如何让这个函数返回正确的值,还是你有一个现有的实现,你要向我们展示它太慢了,分析结果无法支持它?@Clairvoire-那么inRange(3.0,5.0,7.0)应该返回什么呢?名字里有什么?许多程序员(和管理者)轻视好的标识符(函数、变量)名称的重要性。这是一个典型的例子。名称
inRange()
会导致混淆,因为它需要一个布尔结果。如果函数的命名与它的功能一致,比如说
ratio()
distanceRatio()
percentile()
,那么它可能会更清晰。我刚刚看到了您的编辑:您的代码与此非常相似。我通过减少min,max调用的数量简化了结果。你不需要在分母中调用它们。这是没有效率的,因为它包含一个讨厌的除法。也不是代码C++不是使用C++,使用<代码> STD::ABS。我不知道从实现到实现有多少改变,但是RF说它使用了<代码>,这一点不是关于效率的争论,而是满足OP的规范(例如,划分已经是问题的一部分)。例如,他可能最终想要对他的代码进行矢量化,而这对于使用条件来说是不太好的(我的观点不是争论OP考虑的是什么类型的应用程序,或者他的应用程序是否好)。