C++ 确定值是否介于其他两个值(包括)之间的最有效方法

C++ 确定值是否介于其他两个值(包括)之间的最有效方法,c++,performance,math,C++,Performance,Math,与之类似,我希望找出某个值(很可能是双精度浮点数)是否在两个其他值(相同类型)之间。需要注意的是,我不知道哪个值比另一个值大,我正在尝试确定是否应该/如何避免使用std::max/min。下面是一些我已经尝试过的代码: inline bool inRangeMult(double p, double v1, double v2) { return (p - v1) * (p - v2) <= 0; } inline bool inRangeMinMax(double p, dou

与之类似,我希望找出某个值(很可能是双精度浮点数)是否在两个其他值(相同类型)之间。需要注意的是,我不知道哪个值比另一个值大,我正在尝试确定是否应该/如何避免使用std::max/min。下面是一些我已经尝试过的代码:

inline bool inRangeMult(double p, double v1, double v2) {
    return (p - v1) * (p - v2) <= 0;
}

inline bool inRangeMinMax(double p, double v1, double v2) {
    return p <= std::max(v1, v2) && p >= std::min(v1, v2);
}

inline bool inRangeComp(double p, double v1, double v2) {
    return p < v1 != p < v2;
}

int main()
{
    double a = 1e4;

    std::clock_t start;
    double duration;
    bool res = false;

    start = std::clock();
    for (size_t i = 0; i < 2e4; ++i) {
        for (size_t j = 0; j < 2e4; ++j) {
            res = inRangeMult(a, i, j) ? res : !res;
        }
    }
    duration = std::clock() - start;
    std::cout << "InRangeMult: " << duration << std::endl;

    start = std::clock();
    for (size_t i = 0; i < 2e4; ++i) {
        for (size_t j = 0; j < 2e4; ++j) {
            res = inRangeMinMax(a, i, j) ? res : !res;
        }
    }
    duration = std::clock() - start;
    std::cout << "InRangeMinMax: " << duration << std::endl;

    start = std::clock();
    for (size_t i = 0; i < 2e4; ++i) {
        for (size_t j = 0; j < 2e4; ++j) {
            res = inRangeComp(a, i, j) ? res : !res;
        }
    }
    duration = std::clock() - start;
    std::cout << "InRangeComp: " << duration << std::endl;

    std::cout << "Tricking the compiler by printing inane res: " << res << std::endl;
}
inRangeMult中的内联布尔(双p、双v1、双v2){
返回(p-v1)*(p-v2)第一次测试:

(p - v1) * (p - v2) <= 0
变成这样:

bool inRangeComp(double p, double v1, double v2) {
    return v1 <= v2                                // <- v1 and v2 are compared only once
        ? v1 <= p && p <= v2 
        : v2 <= p && p <= v1;
}
bool-inRangeComp(双p、双v1、双v2){
返回v1第一次测试:

(p - v1) * (p - v2) <= 0
变成这样:

bool inRangeComp(double p, double v1, double v2) {
    return v1 <= v2                                // <- v1 and v2 are compared only once
        ? v1 <= p && p <= v2 
        : v2 <= p && p <= v1;
}
bool-inRangeComp(双p、双v1、双v2){

return v1知道如果使用
inline
内联这些函数以获得性能增益,
inline
关键字没有太大的权重(如果有)在确定函数何时内联时。您的测试非常不平衡;结果几乎总是错误的。似乎由于
a
本质上是一个
constexpr
,并且您从未使用过函数的结果,因此您的函数调用可以在编译时预先计算,也可以完全优化。我不算在内关于这个基准测试的准确性。你是如何编译的?我认为
inRangeComp
是最快的。此外,你可以用一个分支来制作min-max版本,比如知道如果你使用
inline
内联这些函数来提高性能,
inline
关键字没有太大的权重(如果有的话)在确定函数何时内联时。您的测试非常不平衡;结果几乎总是错误的。似乎由于
a
本质上是一个
constexpr
,并且您从未使用过函数的结果,因此您的函数调用可以在编译时预先计算,也可以完全优化。我不算在内关于这个基准的准确性。你是如何编译的?我得到<代码> in RealEngpP<代码>是最快的。你也可以用一个像Nit那样的单分支来制作MIN MAX版本,它可能比<代码> V1更可读,但是它都是一样的,但是当你变老的时候,在其他两个值中间更容易读<代码> P<代码>。对潜在的溢出问题有很好的理解。Nit,可能比<代码>更可读。V1都是一样的,但是当你变老时,在其他两个值中间更容易读<代码> P<代码>。