У меня есть вектор, который содержит некоторые значения с плавающей запятой, разумно отделенные друг от друга и отсортированные по некоторой функции. Например,Как вернуть ближайший элемент из упорядоченного набора?
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;
я получаю выход с GCC на машине X86, как
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
Это просто пример. В фактическом коде это набор геометрических точек, отсортированных по их оси у перехвата вдоль заданного угла. – abir