- 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.
Вот что такое настоящие магические числа.
sayidandrtfm 30.06.2012 17:57 # +1
Мини ГСЧ?
bormand 30.06.2012 18:01 # +1
Нет, не угадали ;) Сдвиг флоата на бит вправо и вычитание из этого магического числа возвращает достаточно хорошее приближение 1.0/sqrt(number).
sayidandrtfm 30.06.2012 18:53 # +1
//fixed
Обфейлился.
Как-то писал мини ГСЧ и в качестве смещения использовал адреса переменных с последовательным приведением к разным типам и произвольным сдвигом(тудой-сюдой) — напомнило, но не оно.
bormand 30.06.2012 18:59 # +1
sayidandrtfm 30.06.2012 19:21 # +2
Экзотики, экзотики...и зазудело в одном месте(руки).
Идиты на хрен со своей экзотикой! - сказал, уже после, рассудок.
eth0 30.06.2012 19:24 # +1
movaxbx 30.06.2012 18:59 # +2
И не один раз вроде.
3.14159265 30.06.2012 19:05 # +2
/r prooflink
bormand 30.06.2012 19:14 # +1
movaxbx 30.06.2012 19:20 # +3
http://en.wikipedia.org/wiki/Fast_inverse_square_root вот тут, кстати, расписан весь матан.
bormand 30.06.2012 19:48 # +3
Просто сегодня попался вот этот комикс http://xkcd.ru/664/. И я заинтересовался тем, что это за алгоритм, и почему именно 0x5f375a86. Вот после раскуривания статьи на вики, я и решил выложить код сюда...
3.14159265 30.06.2012 20:02 # +3
Кстати там прикол в том что несколькими годами ранее амд выпустила 3dnow и туды была впилена специальная инструкция для быстрого isqrt.
И вообще изобрел это не Кармак, но известность метод получил именно благодаря ему.
roman-kashitsyn 01.07.2012 00:10 # +4
> 0x5f3759df
у автора определённо есть чувство юмора
bormand 01.07.2012 06:31 # +4
movaxbx 01.07.2012 11:24 # +2
Fai 01.07.2012 11:32 # −8
Да и всю работу делает компонент TResolveProblem.
Так что дельфисты покруче вещи выдают.
vercetti 01.07.2012 12:38 # +4
vistefan 01.07.2012 12:58 # +4
Fai 01.07.2012 23:46 # +1
bormand 01.07.2012 13:05 # +2
> всю работу делает компонент TResolveProblem
Путаемся в показаниях?
govnomonad 01.07.2012 13:45 # +1
Интересно какой "гений" придумал делать компоненты даже для сокетов?
bormand 01.07.2012 14:35 # +4
Ну так это же труъ ООП! В обработчиках минимум кода, а всю логику содержит класс, посвященный определенной задаче. Другое дело что на делфи редко кто так пишет - в типичной проге все свалено в обработчики. И свои компоненты типичный дельфин писать не умеет...
> компоненты даже для сокетов
Имхо это сделано для новичков - не надо думать как описать переменную, как создать объект, как установить свойства и т.п. Кинул - и работает. С другой стороны мне кажется, что невизуальным компонентам на форме не место. Лучше сделали бы специальное окошко под них (в визуал студии вроде так и есть). И опять же все эти упрощения для новичков приводят к тому, что они так и не понимают, что же тут происходит, и используют систему как черный ящик...
TarasB 01.07.2012 14:43 # +4
И правильно сделано.
VCL и так отделяет код гуя (вся байда с HWND) от кода логики (класс TForm1), но рахитекторам и этого мало.
Даже если Ымбаркадеро в новой версии сделает так, что все обработчики по умолчанию будут содержать одну строчку DoSmth с созданием этого DoSmth в отдельно модуле, то рахитекторы будут смеяться над теми, кто пишет логику прямо внутри DoSmth, типа это смешение логики и гуя.
bormand 01.07.2012 14:46 # +3
Другое дело, когда в обработчиках отрисовки гридов начинают запиливать раскрашивание ячеек и т.п, или в обработчиках onChar и прочего начинают клепать фильтрацию ввода, вместо того, чтобы породить свой компонент от стандартного, и загнать в него этот функционал.
TarasB 01.07.2012 14:49 # +3
bormand 01.07.2012 14:57 # +4
Вторая проблема сваливания всего в обработчики - переусложнение. Типичный дельфин пытается упихать всю логику в обработчик. Не зная (или, порой, не желая знать) о том, что можно запилить приватный метод с осмысленным названием и вынести в него часть кода, особенно повторяющегося.
vistefan 01.07.2012 15:03 # +2
bormand 01.07.2012 15:12 # +1
Я просто описываю общие тенденции в коде на делфи, с которым мне приходилось столкнуться.
bormand 01.07.2012 15:10 # +5
К примеру мы разрабатываем простейший чат. Самое простое, что приходит в голову - кинуть на форму сокет, навешать обработчиков на его сигналы, и в них запилить разбор пакетов и прочее. Так и поступит типичный дельфин. А здесь, как раз, стоило бы вынести реализацию протокола в другой класс\компонент. И из гуевых обработчиков уже дергать его достаточно высокоуровневые методы...
vistefan 01.07.2012 15:05 # +2
В студии (по крайней мере в версиях 2008+ вплоть до current) так и есть, но это не отдельное окошко, а панель такая. И она неразрывно связана с вкладкой, на которой ты делаешь визуальное проектирование. Увидеть их раздельно невозможно. Так что логическая прямая связь между формой и этими самыми невизуальными компонентами прослеживается и в студии.
bormand 01.07.2012 15:13 # +1
govnomonad 02.07.2012 05:12 # +1
ЕМНИП, связь прослеживается в винде, т.к. все сообщения привязаны к окнам
AliceGoth 08.07.2012 13:26 # +1
TarasB 01.07.2012 13:43 # +5
Fai 01.07.2012 23:51 # +3
3.14159265 14.03.2016 13:11 # +3