最简洁的检查一个数是否落在其他两个数之间的方法
Most concise way of checking if a number falls betwen two other numbers?
假设我有三个数字。其中两个在它们之间形成一个范围。最后一个数字,我想检查一下它是否在这个范围内。这是一个简单的警告:定义范围的开始和结束的数字可能大于或小于另一个。这是一个物理算法的性能,我正在努力提高,所以我也想避免使用条件语句。
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。
如果开始部分大于结束部分,则将它们交换
相关文章:
- 程序没有问 3 个问题,而是将我对第一个问题的回答用于其他两个问题
- R- armadillo c :用其他两个向量对向量进行排序
- 我无法将二维数组的两个元素的差异分配给C++中其他数组的元素?
- 创建大小为其他两个矩阵大小的矩阵时超出范围
- 如何获取3D矢量的剩余轴知道其他两个
- 从其他两个文件中创建一个分类整数的文件
- 在打印出动态分配的数组中的前两个数字时遇到问题,其他数字工作正常
- 找到两个向量数组的组合,该数组的总和是 c++ 中所有其他组合的最大值
- 在C 中,可以从第三个共享对象访问其他两个不同共享对象
- 最后一行欧普特两个组合输出问题?如果其他语句
- 使用指针在Qt Creator UI中的其他两个指针之间切换
- 如何在两个其他两个之间设置工具栏
- 从两个列之一返回值,或跳过数组中的所有其他元素
- 更改指针指向指针的位置,同时保持其他两个指针的值
- "函数将查找并存储在参数中,其他两个参数的总和"是什么意思?
- 将一个 constexpr 数组初始化为其他两个 constexpr 数组的总和
- 仅使用其他两个号码到达目标号码
- 将类向量的两个函数返回值与其他类向量元素函数进行比较
- 如何比较同一对象的两个向量并获得其他元素
- 最准确和正确的方式来比较两个大的windows 8.1注册表文件(c++ / c#或任何其他)