Мне нужен оптимизированный алгоритм бинарного поиска в массиве отсортированных чисел. Я сделал это и обнаружил, что с помощью поплавка чисел магазина быстрее, чем при использовании целого числа, потому что в конце концов я должен вычислитьСравнить float array as int array
(frameNumber-this->frameNumber[imin])/(this->frameNumber[imax]-this->frameNumber[imin])
this->frameNumber[imin]
является самым большим номер кадра меньше равно, что frameNumber
и this->frameNumber[imax]
является наименьшим один больше равнее что. Этот код предназначен для вычисления прогресса между этими двумя ключевыми кадрами. массив frameNumber является статическим. Мне нужно только разобраться. Но обращайтесь к нему много раз с бинарным поиском и приведенным выше кодом для расчета прогресса.
Преобразование из int в float проводило некоторые циклы. Тогда я обнаружил, что в asm есть много инструкций fpu. Я беспокоюсь, что они могут быть медленнее, чем целые.
Так что вот и вопрос. Можно ли преобразовать массив отсортированных чисел с плавающей запятой в int * и запустить на нем двоичный поиск?
Это означает, что:
void binary_search(float key,float* array,...)
{
int key_integer=*(int*)&key;
int* array_intege(int*)array;
binary_search_for_integers(key_integer,array_integer,...);
}
Или мой выше вывод неверны? (Такие, как литье междунар плавать не так costy или Comparision между плавающим точками такой же скоростью, как целые числа?
спасибо!
Ваш вопрос непонятен, но прямой ответ: нет, вы не можете преобразовать такой массив. – Amit
Обычно это не сработает - он будет интерпретировать биты каждого элемента как ints вместо float. Тем не менее, есть интересная причуда с плавающей точкой IEEE, которая сохраняет порядок, если они интерпретируются как целые числа одинаковой длины. Таким образом, ваш бинарный поиск мог бы работать, если 'sizeof (int) == sizeof (float)' на вашей системе, и ни одно из значений не является NaN. Но это не гарантируется стандартами C или C++. – rlbond
Он также не работает для отрицательных чисел. – fangzhangmnm