а вот ArrayBsearch

 
Так уж получается, что я жалуюсь каждый день на что нибудь. Прошу понять меня правильно, это не свойство моего характера, это так получается. Вот и теперь. Пытаюсь использовать ArrayBsearch. В доке про него написано, что "Если элемент с указанным значением в массиве отсутствует, функция вернет индекс ближайшего элемента (по значению)." На самом деле, у меня сложилось впечатление, что он "Если элемент с указанным значением в массиве отсутствует, функция вернет индекс меньшего элемента (по значению)." Может я и не прав, может недостаточно хорошо тестировал.
 
код нужен...
 

О! я знал, что не первый. Но у меня случай другой. У меня всё отсортировано.

int start()
{
double buf[]={ 1.45, 1.46, 1.47, 1.48, 1.49 };
double val=1.469;
//---- печатаем значения
for(int i=0;i<ArraySize(buf);i++) Print(i," - ",buf[i]);
//---- ищем
int pos=ArrayBsearch(buf,val,ArraySize(buf),0,MODE_ASCEND);
Print("Нашел индекс: ",pos," и его значение в массиве: ",buf[pos]);
//----
return(0);
}


Так вот. Он мне выдает индекс 1. А должен был, если "индекс ближайшего элемента", выдать индекс 2, то есть третий элемент списка. Потому что 1.469 ближе к 1.47, чем к 1.46. Или я чего то путаю?

 

Наверно ArrayBSearch() так работает (примерно): while(val<buf[i]){pos=i;i++}

 
мне придется, или самому писать бисёрч, или другой алгоритм использовать. нынешний глюк я обойти могу, просто сдвинув массив на полшага, но где гарантия что в следующем релизе не поправят и тогда мои извраты перестанут правильно работать.
 

Скорее не баг. Ближайшее может быть по значению, а может по индексу, требуется же отсортированный массив, индекс подразумевается, иначе бы не было нужно массив сортировать, итак бы нашлось ближайшее значение.

 
Не, ближайшее может быть только по значению, там так и написано.
 

Используется стандартная функция bsearch.

При сортировке по возрастанию ищется ближайшее значение снизу.

При сортировке по убыванию ищется ближайшее значение сверху.

Функция задумывалась прежде всего для таймсерии Time[], поэтому такое поведение

 

Как-то нехорошо stringo на фотографии улыбается. Это явилось причиной для дополнительной проверки.

.

bsearch - в контексте mql есть функция неизвестная.

А в славном языке Си bsearch берет *нестандартную* пользовательскую функцию compare().

Логика которой известна только написавшему эту функцию программисту.

.

Архитектор изволил написать спецификацию функции ArrayBsearch так:

Если элемент с указанным значением в массиве отсутствует, функция вернет индекс ближайшего элемента (по значению).

.

Уважаемый stringo, то, что Вы написали, может быть продуктом исследования Вами актуально существующего кода.

Но заявлять имплементированную логику как должное поведение - некорректно

(Вы фактически говорите: "мы писали на стандартном языке программирования, как работает - так и правильно").

Т.к. логика функции должна соответствовать спецификации, а не сама себе...

 
stringo >>:

Используется стандартная функция bsearch.


Понятно. Вы её не будете менять в будущих релизах? Меня вот этот вопрос интересует больше. Если нет, то я просто учту эти особенности у себя в алгоритме и всё.

Причина обращения: