查看数字是否包含在未排序的两个数字间隔内的最有效方法是什么?

时间:2017-07-11 23:40:24

标签: c++ performance

所以我知道这个问题可能非常简单,不值得问,因为差异很小,但我还是想知道。

让我们考虑三个浮动,' a'' b'和'数字'。我们想知道'数字'包含在边界的范围内' a'和' b';

'一个'和' b'是区间的限制,但它们是未分类的:' a'可能小于' b'反之亦然。

哪种功能会带来最快的结果?

1)

bool isNumberInInterval(float a, float b, float number)
{
    if (a < b)
    {
        return ( (a <= number) && (number <= b) );
    }
    else
    {
        return ( (b <= number) && (number <= a) );
    }
}

2)

bool isNumberInInterval(float a, float b, float number)
{
    return ( ( (b <= number) && (number <= a) ) || ( (a <= number) && (number <= b) ) );
}

2 个答案:

答案 0 :(得分:2)

很难说哪个更快。它取决于很多东西(数字的分布,分支预测,编译器)。你应该基准它。在我的PC上,使用GCC 6.3,具有均匀分布的[0; 1]数字,它们的速度是相同的。

这种变体在当前的PC上应该更快(它比我的PC上的变体快25%):

bool isNumberInInterval(float a, float b, float number)
{
    return (a-number)*(b-number)<=0;
}

答案 1 :(得分:0)

这很可能取决于机器和编译器。但你可以说第一个更快。

第一个版本最多可执行3次比较和1次逻辑操作。但是,如果在第一个操作数为&&时可以使false短路,则可以执行少至2次比较和0次逻辑运算。

第二个版本的最坏情况是4次比较和3次逻辑操作。但它必须执行至少2次比较和1次逻辑操作:您不能将&&||短路。