- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
float Q_rsqrt( float number )
{
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = * ( long * ) &y; // evil floating point bit level hacking
i = 0x5f3759df - ( i >> 1 ); // what the fuck?
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
// y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
return y;
}
The following code is the fast inverse square root implementation from Quake III Arena, stripped of C preprocessor directives, but including the exact original comment text.
Вот что такое настоящие магические числа.
Мини ГСЧ?
Нет, не угадали ;) Сдвиг флоата на бит вправо и вычитание из этого магического числа возвращает достаточно хорошее приближение 1.0/sqrt(number).
//fixed
Обфейлился.
Как-то писал мини ГСЧ и в качестве смещения использовал адреса переменных с последовательным приведением к разным типам и произвольным сдвигом(тудой-сюдой) — напомнило, но не оно.
Экзотики, экзотики...и зазудело в одном месте(руки).
Идиты на хрен со своей экзотикой! - сказал, уже после, рассудок.
И не один раз вроде.
/r prooflink
http://en.wikipedia.org/wiki/Fast_inverse_square_root вот тут, кстати, расписан весь матан.
Просто сегодня попался вот этот комикс http://xkcd.ru/664/. И я заинтересовался тем, что это за алгоритм, и почему именно 0x5f375a86. Вот после раскуривания статьи на вики, я и решил выложить код сюда...
Кстати там прикол в том что несколькими годами ранее амд выпустила 3dnow и туды была впилена специальная инструкция для быстрого isqrt.
И вообще изобрел это не Кармак, но известность метод получил именно благодаря ему.
> 0x5f3759df
у автора определённо есть чувство юмора
Да и всю работу делает компонент TResolveProblem.
Так что дельфисты покруче вещи выдают.
> всю работу делает компонент TResolveProblem
Путаемся в показаниях?
Интересно какой "гений" придумал делать компоненты даже для сокетов?
Ну так это же труъ ООП! В обработчиках минимум кода, а всю логику содержит класс, посвященный определенной задаче. Другое дело что на делфи редко кто так пишет - в типичной проге все свалено в обработчики. И свои компоненты типичный дельфин писать не умеет...
> компоненты даже для сокетов
Имхо это сделано для новичков - не надо думать как описать переменную, как создать объект, как установить свойства и т.п. Кинул - и работает. С другой стороны мне кажется, что невизуальным компонентам на форме не место. Лучше сделали бы специальное окошко под них (в визуал студии вроде так и есть). И опять же все эти упрощения для новичков приводят к тому, что они так и не понимают, что же тут происходит, и используют систему как черный ящик...
И правильно сделано.
VCL и так отделяет код гуя (вся байда с HWND) от кода логики (класс TForm1), но рахитекторам и этого мало.
Даже если Ымбаркадеро в новой версии сделает так, что все обработчики по умолчанию будут содержать одну строчку DoSmth с созданием этого DoSmth в отдельно модуле, то рахитекторы будут смеяться над теми, кто пишет логику прямо внутри DoSmth, типа это смешение логики и гуя.
Другое дело, когда в обработчиках отрисовки гридов начинают запиливать раскрашивание ячеек и т.п, или в обработчиках onChar и прочего начинают клепать фильтрацию ввода, вместо того, чтобы породить свой компонент от стандартного, и загнать в него этот функционал.
Вторая проблема сваливания всего в обработчики - переусложнение. Типичный дельфин пытается упихать всю логику в обработчик. Не зная (или, порой, не желая знать) о том, что можно запилить приватный метод с осмысленным названием и вынести в него часть кода, особенно повторяющегося.
Я просто описываю общие тенденции в коде на делфи, с которым мне приходилось столкнуться.
К примеру мы разрабатываем простейший чат. Самое простое, что приходит в голову - кинуть на форму сокет, навешать обработчиков на его сигналы, и в них запилить разбор пакетов и прочее. Так и поступит типичный дельфин. А здесь, как раз, стоило бы вынести реализацию протокола в другой класс\компонент. И из гуевых обработчиков уже дергать его достаточно высокоуровневые методы...
В студии (по крайней мере в версиях 2008+ вплоть до current) так и есть, но это не отдельное окошко, а панель такая. И она неразрывно связана с вкладкой, на которой ты делаешь визуальное проектирование. Увидеть их раздельно невозможно. Так что логическая прямая связь между формой и этими самыми невизуальными компонентами прослеживается и в студии.
ЕМНИП, связь прослеживается в винде, т.к. все сообщения привязаны к окнам