C++ 确定值是否介于其他两个值(包括)之间的最有效方法
与之类似,我希望找出某个值(很可能是双精度浮点数)是否在两个其他值(相同类型)之间。需要注意的是,我不知道哪个值比另一个值大,我正在尝试确定是否应该/如何避免使用std::max/min。下面是一些我已经尝试过的代码: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
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<代码>。