Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Извиняюсь, но с "чутьем" тут перегнуто. Есть правило: если... 23.08.07 16:36 Число просмотров: 6077
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman Отредактировано 23.08.07 16:43 Количество правок: 1
|
> Только что проверил с GCC - (a + b) / 2 транслируется в > сложение и битовый сдвиг со знаком. Компиляторы "чувствуют" > куда пойдет результат и могут произвести целочисленное > деление вместо вещ. или же битовый сдвиг, где это возможно.
Извиняюсь, но с "чутьем" тут перегнуто. Есть правило: если оба операнда целые, то и результат число целое. Иногда может помочь еще одно правило: результат арифметических операций над целыми числами округляется до ближайшего целого в меньшую сторону.
Правило оптимизирующих компиляторов: если делитель или второй множитель константа типа 2 в степени N, то операция деления/умножения заменяется сдвигом. На данный момент процессоры умеют сделать сдвиг за один такт, а умножать пока еще за несколько, ну а делить за log2(делитель).
> А floating point арифметика очень тяжелая в плане времени > выполнения, поэтому для двоичного поиска она не годится.
Конечно "тяжелее", но уже не "очень".
> А вот пример того, как двоичный поиск с (a + b) / 2 привел > к ошибке: > http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5045582 > > Поразительно, что ошибку так и не исправили как следует. > Массив интов с двумя миллиардами элементов - не такая уж и > фантастика, и насколько мне известно, такие массивы реально > существуют в Гугле.
Если в документации к программе указано "количество элементов не более ...", то это уже не ошибка, а документированная фича.
В принципе переменные можно было бы обозвать беззнаковыми (индекс элемента не может быть отрицательным) - С это позволяет, тогда максимальное значение увеличилось бы в два раза, но все равно не превысило бы два милиарда. Извините - всему есть предел, скоро и 64 разрядных интов не хватит.
|
|
|