我有一个向量,其中包含一些浮点值彼此合理,并根据某些功能排序。例如,如何从有序集合中返回最近的元素?
double foo(double x)
{
return 199.1*x;
}
double x = 3000000.3157;
double y = x + DBL_EPSILON;
std::vector<double> s { y,y+10};
std::sort(s.begin(),s.end(),[](double x,double y) { return foo(x) < foo(y) ;});
现在有人有一个关键是贴着一张我在s
,如x
。在lambda时代,都有自己的小功能来进行搜索,比如
std::cout<<std::distance(s.begin(),std::lower_bound(s.begin(),s.end(),x,
[] (double x,double y) { return foo(x) < foo(y);}))<<std::endl;
std::cout<<std::distance(s.begin(),std::lower_bound(s.begin(),s.end(),x,
[] (double x,double y) { double f1 = foo(x);
double f2 = foo(y);
return f1 < f2;}))<<std::endl;
,并得到不同的位置(以及相应的值有很大的不同)。
注视使用,它一出现,它们与发现了一个关键k
- 最近的元素从有序集中占尽天时地利的浮点值。
- 的比率,
r
,其(理想地应该是[0,1])附连到连续值x1
&x2
这样一个函数f(x1,x2,r)
的返回值是大约等于k
。
它们都看起来像相关,并且与插值有关。我如何实现它们?
注:
在下面
double f1 = foo(x);
double f2 = foo(y);
bool l = foo(x) < foo(y);
std::cout<<std::boolalpha<<(f1<f2)<< " "<<l<<" "<<(f1 == f2) << std::endl;
std::cout << std::boolalpha << (foo(x) < foo(y)) << " "<< (foo(y) < foo(x))
<< " "<<(foo(x) == foo(y))<<std::endl;
std::cout << std::boolalpha << std::isless(foo(x) , foo(y))
<< " "<< std::isless(foo(y) , foo(x)) <<std::endl;
我一个X86机器上得到输出,GCC为
false true true
true true false
false false
短代码,而我的猜测是,GCC做更高的精度(80bit的)在飞行,除非我强迫它存储结果,导致不同的结果l
& (f1<f2)
(导致上述问题)。我也有兴趣知道为什么foo(x) < foo(y)
和foo(y) < foo(x)
都说true
!
除了非常接近的数字的四舍五入之外,你的'foo(x)'在语义上等同于仅仅由数字本身排序......如果'x 0' ... –
twalberg
这只是一个例子。在实际的代码中,它是一组几何点,它们按照给定角度的y轴截距排序。 – abir