Считай обратный корень быстро с волшебной константой 0x5f3759df

Поділитися
Вставка
  • Опубліковано 14 січ 2025

КОМЕНТАРІ • 225

  • @iforand
    @iforand Рік тому +71

    1:45 Нормаль - это вектор с длинной равной 1. "Вычислять длину нормали" - этот как минимум абсурдно. :) Обратный корень как раз таки нужен для вычисления этой нормали - нормирования. Обратный корень от квадрата длины вектора (что есть просто возведение в квадрат компонентов со сложением) как раз и даёт величину, на которую нужно умножить каждую компоненту вектора, чтобы его длина стала единичной - сделать нормалью. Ну и вычисляем именно обратный корень, потому что операция деления сложнее чем операция умножения.
    11:33 Для любого float числа мантисса 0

    • @math-to-masses
      @math-to-masses  Рік тому +4

      Всё правильно сказали, да. Спасибо!

    • @danielmilyutin9914
      @danielmilyutin9914 Рік тому

      Полагаю, что в процессоре при извлечении корня, скорее всего, используется то же представление и показатель делится пополам (видимо, с переносом нечётного бита на мантиссу), а вот мантисса уже методом Ньютона досчитывается.
      В принципе они в fast_inv_sqrt выиграли за счёт того, что в процессоре не было именно встроенной функции inv_sqrt и за счёт меньшего числа итераций. Процессор должен покрыть весь диапазон с максимальной точностью, а им точность была не так важна.
      Хотя я видел версии fast_inv_sqrt, где было несколько итераций.

    • @shanewalsch
      @shanewalsch Рік тому +6

      Мне кажется ты путаешь понятия. Нормаль к плоскости - вектор который перпендикулярен плоскости. У него нету ограничения на длину. А вот нормализованный вектор, это вектор с длиной 1.

    • @levshx
      @levshx Рік тому

      Похоже в графике так не принято как в матеше, если вы математик, в графике под нормалью понимают перпендикуляр к плоскости. Просто её задают XYZ вектором и после матричных преобразований (растяжений по оси и поворотов) объектов, нормализация затратный процесс и не всегда нужен, а нормаль хоть и не нормализована но продолжает выполнять свою функцию - указывать направление :D

    • @shanewalsch
      @shanewalsch Рік тому

      @@levshx так вот как раз в математике под нормалью это и понимают

  • @muggzzzzz
    @muggzzzzz Рік тому +2

    Как сказал один умный человек, "настоящее программирование начинается там, где заканчиваются вычислительные ресурсы".
    В конце 90-х, для ускорения вычисления графики на моем 486-м, использовал вставки на ассемблере (прямая адресация в видеопамять и синхронизация кадра с обратным ходом электронного луча ЭЛТ), и составлял таблицы с вычисленными значениями синуса и косинуса для ускорения афинных преобразований координат.

  • @infavi
    @infavi Рік тому +48

    Спасибо алгоритмам ютуба что нашёл этот канал, спасибо вам за ваше творчество!

    • @y6itb_vsex_zhidov
      @y6itb_vsex_zhidov Рік тому

      Почему мой мозг не шарит в логике...

  • @alxmats
    @alxmats Рік тому +19

    Мне 35 и я далёк от программирования. В школе и университете постоянно слышал о том, что программирование есть сплошная математика (это не так). Но это видео продемонстрировало как математика может быть прикладной в жизни. Автор, ты - монстр. Спасибо за исследование.

    • @nishichi
      @nishichi Рік тому

      @@MarkMath можно, пиши XD

    • @MrGhost-bg6ud
      @MrGhost-bg6ud Рік тому

      Математика там конечно далеко не сплошная, но без неё некоторые задачи не решить

  • @iljakot_tran4131
    @iljakot_tran4131 Рік тому +22

    Я в восторге!
    Самый приятный геймдев - видос связанный с математикой, который я видел за последние времена

  • @sanyaharos1727
    @sanyaharos1727 Рік тому +16

    Господи как же это круто! Вот это реально настоящие программисты! Большой респект и вам за то что сделали такой хороший обзор. Напомнило мне ситуацию когда надо было написать равномерное движение по кривым Безье, но без дифференциалов, интегралов, метода Ньютона (потому что я слишком тупой для этого). 4 недели тычил пальцем в небо, но нашел приемлемое в рамках задачи упрощение и нашел таки сложное уравнение которое и движение делало равномерным (визуально) и не требовало знаний высшей математики и не использовало огромных ресурсов при выполнении

    • @math-to-masses
      @math-to-masses  Рік тому +4

      Спасибо вам за ваши слова! Мне кажется, что мы с вами нашли друг друга, поскольку я вижу цель моего канала именно так: рассказывать о том, что может сделать математика без долгих и сложных выводов.
      Ваш комментарий поддерживает веру, что я это делаю с пользой для окружающих :)

  • @invisiblealex007
    @invisiblealex007 Рік тому +3

    У меня был недавно проект с одной железякой, которая должна была вычислять сложое значени с сплавающей точкой. Но МК достаточно сабая вещь и я занимался лианиризацией подобнлй функции)) в итоге использовал пайтон и сделал формулку, которая была намного проще, чем исходная загагулина (на этом пайтон большен е понадобился. И все, проект заработал на МК. Оказывается сделал то, что делали предки и до меня)))) мне контент зашёл, молодчина!

  • @egorkuznetsov6160
    @egorkuznetsov6160 Рік тому +4

    Видел похожее видео на английском, но там не было момента где бы мне сказали "подожди не выключай" и досмотрел ведь и даже интересно было, спасибо

    • @titanovsky
      @titanovsky Рік тому

      Я все ждал, пока кто нибудь тот популярный ролик переведёт или интерпретирует. И это случилось)

  • @inotak
    @inotak Рік тому +2

    Смотришь на такое и реально задумываешься как люди прошлого с умом подходили к таким вопросам. Как находили ухищрения для своего времени. Шикарно

  • @ukusezha
    @ukusezha Рік тому +2

    Вас ждёт большой успех, рада, что нашла ещё этот чудесный канал в самом начале!

    • @math-to-masses
      @math-to-masses  Рік тому

      Спасибо за тёплые слова! Я честно не ожидал, что эта тематика настолько большому количеству человек понравится!

  • @MasterShuShuShu
    @MasterShuShuShu Рік тому +1

    Прямо восхищает! Спасибо большое!

  • @isavinof
    @isavinof Рік тому +4

    Офигенная оптимизация! И офигенное объяснение) спасибо!

  • @dail4568
    @dail4568 Рік тому +2

    Только закончился первый семестр... а тут вспоминать свои знания про логарифмирование функций...

  • @nikolayparygin610
    @nikolayparygin610 Рік тому +2

    то чувство, когда далёк от темы, а к концу ролика так и не научился "считать обратный корень быстро"

  • @ИгорьВласов-л4р
    @ИгорьВласов-л4р Рік тому +1

    Гениально! Спасибо большое!

  • @TheJabberwahh
    @TheJabberwahh Рік тому +5

    Где-то читал, что Кармак подсмотрел этот трюк у CGI (уж не знаю где именно они его использовали и придумали ли сами или тоже у головастых математиков подсмотрели), но подписался :)

    • @pmak6074
      @pmak6074 Рік тому +2

      Даже не у CGI - там вполне конкретный математик придумал данный алгоритм, и к слову CGI у него лицензировала его.

  • @ILikeActions
    @ILikeActions Рік тому

    Огромное спасибо за видео, очень интересно, пилите еще! :)

  • @andrey_karpiuk
    @andrey_karpiuk Рік тому

    Офигенный разбор! Спасибо за видео)

  • @AndrewQuardex
    @AndrewQuardex Рік тому

    Шедеврально

  • @IshuckShow
    @IshuckShow Рік тому +2

    Алгоритмы зарешали, топ контент

  • @iSJ9y217
    @iSJ9y217 Рік тому +2

    Для тех, кто изучает C/C++:
    Подход "i = *(long*)x" не является нормой.
    В Quake III работал хорошо, но для современного компилятора при высокой оптимизации это может привести к ошибкам. Причина сложна (гуглить "strict aliasing", если хочется узнать больше), но правильной альтернативой будет "memcpy(&i, &x, 4)".
    Также хорошей идеей будет использовать "uint32_t" вместо "long", чтобы убедиться, что "i" имеет 4 байта. В современных системах "long" часто имеет размер 8 байт.

  • @dimontusgaming8362
    @dimontusgaming8362 Рік тому +1

    Я не знаю что я смотрю. Мало чего понял но очень интересно )

  • @РамильХуснутдинов-з4ф

    На парах Артём Юрьевич, а в ютубе Антон Юрьевич...
    Контент невероятен

  • @oztapozarirus9655
    @oztapozarirus9655 Рік тому

    Спасибо, очень круто! 👍

  • @AJIiEN
    @AJIiEN Рік тому

    ну за такое не грех и подписаться ))

  • @usernamer519
    @usernamer519 Рік тому

    бро, это очень круто, спасибо!

  • @sergeybryukhovskikh3096
    @sergeybryukhovskikh3096 Рік тому

    Очень классный разбор, спасибо!

  • @Vorono4ka
    @Vorono4ka Рік тому

    Классное видео, спасибо большое, теперь знаю чуть больше!

  • @РинатХасаншин-м8д

    спасибо за разбор, алгоритм действительно гениален, хотел бы заметить что на больших цифрах этот метод не всегда выдает точный результат, преблизительное значение в играх это круто но не в реальных мат проектах!

    • @iforand
      @iforand Рік тому +1

      Вообще не совсем. Его относительная точность зависит не от размера числа, а от того, насколько значение мантиссы близко к двум точкам, являющимися пересечением log2(1+m) c аппроксимирующей прямой. Например, для числа 1.25 или 1.75 он даст значительно лучшую точность, чем для 1.0 или 1.5. Ну и соответственно для других чисел, являющимися результатом перемножения на степень двойки: для 5 и 7 будет точнее, чем для 4 и 6; для 1280 и 1792 точнее чем для 1024 и 1536. Но учитывая, что в реальных условиях значение мантиссы будет чисто случайным, то и точность вычислений будет скорее опысаваться неким средним значением ошибки. Но вообще, люди считали, точность непосредственно самого метода взятия обратного квадрата без последующего приближения не хуже 2%, т.е. можно получить правильными почти две первые значащие цифры. Первое приближение практически удваивает количество правильных значащих цифр.

    • @РинатХасаншин-м8д
      @РинатХасаншин-м8д Рік тому

      @@iforand Спасибо, за подрбный ответ!

  • @pingburner
    @pingburner Рік тому

    Как-то натыкался в поисковике на этот код и толком не понял. Теперь немножко понятнее.

    • @math-to-masses
      @math-to-masses  Рік тому

      Спасибо вам за ваши слова!

  • @fedormaximoff6587
    @fedormaximoff6587 Рік тому +2

    Я окончил бакалавриат по ИВТ и сделал где-то 20 курсачей вокруг похожей темы и сначала офигел с того, какая ересь тут происходит. Дело в том, что я реализовывал двоичные автоматы для преобразования числа из float-формата в int и наоборот, а здесь решается обратная задача. Один и тот же набор символов ИНТЕРПРЕТИРУЕТСЯ как float или int, но эти числа не совпадают.
    В видео очень не хватает одной вещи для понимания:
    в числе:
    11111111 | 000000000000000000000000
    Нули это m/M, а единицы это e/E. Конкретная форма зависит от того, смотрим мы на набор знаков как на float (тогда мы мысленно подставляем перед рядом нулей единицу и запятую и умножаем все это на два в степени 11111111) или как на int (тогда нам, как людям, будет проще просто посмотреть на число целиком и перевести из двоичной системы счисления в десятичную, но компьютеру нужно объяснить все манипуляции по тому, что вообще значит мантисса. Чтобы создать такой int, который будет ВЫГЛЯДЕТЬ абсолютно как этот float, нужно выполнить перечисленные операции для E и M. Абсолютно гениально и удивительно, что эта задача вообще кому-то пригодилась.

  • @xaoc3932
    @xaoc3932 Рік тому

    Круто, нужно эту штуку запомнить на будущее

  • @reloginn4911
    @reloginn4911 Рік тому +2

    Комментарий для продвижения ролика, именно такие программисты должны быть ;)

  • @vdrmkr
    @vdrmkr Рік тому

    Комментарий был оставлен самим Кармаком на code review.

  • @delafrog
    @delafrog Рік тому +1

    судя по приведённым данными расчёта, относительная точность метода около 1 процента, что и неудивительно - всего 1 итерация метода Ньютона. Для игры, этого наверное вполне достаточно, но в общем случае необходима точность соответствующая типу float или double.
    В целом, получаётся, что данный hack позволяет получить хорошее начальное приближение для старта итерационного метода.
    Весьма поучительно, впрочем, что анализ машинного представления числа помогает получить такого рода оптимизации.

    • @delafrog
      @delafrog Рік тому +1

      строго говоря, приведенный код, в буквальном его виде работать не будет. здесь надо ввести локальную переменную float y = *(float*) & i;
      и итоговая величина :
      y = y*(1.5f - 0.5f*x*y*y);
      return y;
      и кстати, эта итерация метода Ньютона, эквивалента разложению по Тейлору функции 1/sqrt(x) вблизи значения найденного hack-методом.
      повторение последней строки ещё два раза ведёт к повышению точности результата почти до полной точности представления числа типа float:
      y = y*(1.5f - 0.5f*x*y*y) ;
      y = y*(1.5f - 0.5f*x*y*y) ;
      y = y*(1.5f - 0.5f*x*y*y) ;
      return y;
      при переходе к последующей строке, 'y' выступает как новое приближение. Дальнейшее повторение этой строки не ведёт повышению точности - упирается в точность формата float.
      Интересно было бы аналогичный алгоритм сделать для double. то есть надо найти соотвествующую чудо-константу для double :)

    • @pmak6074
      @pmak6074 Рік тому

      При 64 битных числах, точно получается очень высокой к слову, и практически не отличается от искомого.

  • @ДмитрийСирота-в2ъ

    Интересно, очень интересно!
    Я преподаю численные методы и подобные находки - просто изюм в булочке обычных численных методов.
    Любопытно ещё сравнить ТОЧНОСТЬ подобного вычисления обратного корня, велика ли погрешность?

    • @math-to-masses
      @math-to-masses  Рік тому

      Погрешность, конечно, большая. Сотые от числа. Поэтому применять с осторожностью :)

  • @enIgma5715735icq
    @enIgma5715735icq Рік тому

    Кармак крутой, знаю это во времён Commander Keen. Уже есть видео, как там он сделал правный скорллинг? )

  • @vasiadrobyshevskiy9081
    @vasiadrobyshevskiy9081 Рік тому

    Чел, какой же ты классный, про метод Ньютона обязательно сними ролик!!!

  • @kraageshmikosevaar794
    @kraageshmikosevaar794 Рік тому +2

    Ну дак, в ID software настоящие программисты работают. Одни из немногих, кто действительно заморачивался с оптимизацией.
    DOOM(2016) выдавал потрясающу графику на устаревшем железе (Core 2Duo E8400 + GTX570 + 8GB DDR2) - на средне-высоких настройках графики не было просадок ниже 55FPS в FHD.
    Полагаю, и там полно таких странных и гениальных решений. Обычно игры того времени если и шли, то очень скудно, на минималках, с пониженным разрешением. Да и таких красот не могли дать.
    Можно и в древность заглянуть, первые Doom'ы (1992-1993). Там тоже было довольно немало хитростей.

    • @pmak6074
      @pmak6074 Рік тому

      Первые думы - на самом деле плохой пример. Могу объяснить: даже Сильверман, который был ещё менее компетентен в математике, чем Кармак (и тот и другой написали кучу ненужных asm костылей, хотя на FORTH весь код работал бы с той-же скоростью, что написанный ими, ну да ладно). Даже Сильверман, интуитивно, написал метод быстрее, чем перебор BSP-дерева, использованный Кармаком. И к слову id tech и build - ровесники, - разница только в том, что игры на build появились позже.

  • @JohnJTraston
    @JohnJTraston Рік тому

    Это очень полезная штука в 3Д графике для нормализации векторов. Очень частая операция и там именно нужен не просто корень а обратный. В те времена был FPU. Корень-то был но самое самое тормозное это деление. Оно до сих пор самое тормозное даже сейчас. Поэтому обратные корень очень удобен. Во всех процах где SSE/AVX и GPU это делается lookup таблицей и несколькими итерациями Ньютона-Рафсона для повышения точности.

  • @Kolemag
    @Kolemag Рік тому

    Я думал глаза просто выпадут в итоге

  • @alexeidubrovin5234
    @alexeidubrovin5234 Рік тому +3

    Спасибо, познавательно! Ну и там, наверное, корректнее 1.0/sqrt(number), чтобы не было возни с переводом из int. А с SSE инструкцией RSQRTSS не сравнивали время? Могу сказать что внутрях ARM-библиотеки для DSP я видел rsqrt делался так же через метод Ньютона, см VRSQRTS в armasm или файл arm_sqrt_q31.c в ARM CMSIS, как это делает Intel в SSE (rsqrtss) или FPU(fsqrt) насколько мне известно коммерческая тайна

    • @math-to-masses
      @math-to-masses  Рік тому

      1.0 вместо 1, думаю, компилятор сам подставил. Ну, во всяком случае я на это надеюсь 😅
      Про RSQRTSS не слышал. Спасибо, что поделились, я попробую разузнать

    • @alexeidubrovin5234
      @alexeidubrovin5234 Рік тому +1

      ​@@math-to-masses делается приблизительно так:
      #include
      #include "immintrin.h"
      float sse_rsqrtf (const float a)
      {
      __m128 b, t;
      float res;
      b = _mm_set_ss (a);
      t = _mm_rsqrt_ss (b);
      _mm_store_ss (&res, t);
      return res;
      }
      int main()
      {
      std::cout

  • @Bloody_River
    @Bloody_River Рік тому +2

    Кислотно-жёлтые тексты с мелким шрифтом на кислотно-синем фоне...
    Зачем? За что?

  • @v61kz
    @v61kz Рік тому +1

    Здо́рово конечно💪👍
    Когда на экране всё пыхает, наверное даже приближённый расчёт незаметен🤔
    Вот сейчас эвм мощнее, программистов набирают по объявлению, потом запускаешь приложение, а оно вылетает - индекс массива out if range😂😂😂

  • @orefkov
    @orefkov Рік тому +1

    В бенчмарке также стоит попробовать сравнить ещё и с pow(x, -0.5f). Хотя возможно современный компилятор это соптимизирует в такой же код :)

    • @math-to-masses
      @math-to-masses  Рік тому +1

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

  • @chronos6812
    @chronos6812 Рік тому +1

    Нифига не понятно, НО очень интересно)

  • @danielmilyutin9914
    @danielmilyutin9914 Рік тому +1

    Красиво написан код на С++. 🙂
    Хотя для единичных бенчмарков цифры и показательные, я бы подряд побольше итераций запустил и посчитал время.

  • @swordoman2158
    @swordoman2158 Рік тому +1

    Видео супер! Действительно очень классный алгоритм! Теперь понятно, что видеокарты придумали как раз таки чтобы упростить разработчикам игр жизнь в вычислении всяких обратных корней и прочего. Хотелось бы, конечно, узнать и о других задачах и решениях, с которыми пришлось столкнуться программистам в те времена или наже в наши дни.

  • @pollcampus
    @pollcampus Рік тому +11

    Сокращение выполнения кода в 5 раз это однократное выполнение, а в игре скорее всего этот расчет производился десятки тысяч раз. Надо скачать исходники движка (так как они в свободном доступе) переписать этот участок кода используя классический подход вычисления, скомпилировать и сравнить производительность игры (FPS, 1%, 0,1% например) до и после изминений) Эх жаль я не программист(

    • @АндрейЛарионов-ж3э
      @АндрейЛарионов-ж3э Рік тому

      Мне нужна ссылка на исходники и желательно знать как всю эту банду собрать.

    • @cemehob702
      @cemehob702 Рік тому

      Насколько я понимаю, этот лайфхак в расчёте КАЖДОЙ точки на экране применялся.
      Если брать стандарт того времени - 1024*768 * 60FPS, то получаем чуть меньше 50 миллионов таких операций в секунду :)

    • @hanqnero
      @hanqnero Рік тому

      Для каждого полигона, который нужно отрендерить.

  • @Sergey.Aleksandrovich.P-37rus

    я Джун - стажёр,я бы додумался до этого когда нибудь в жизни...но из id Software опередили 😭😭

  • @SCXBelka
    @SCXBelka Рік тому

    Го метод Ньютона!

  • @vlcdn
    @vlcdn Рік тому

    Трюк классный, но сейчас в нём смысла нет. Если в коде посчитать в лоб, то на x86 компилятор скорее всего использует операцию RSQRTSS, которая в несколько раз быстрее этого трюка.
    Но это не отменяет красоты и необычности подхода. :)

    • @math-to-masses
      @math-to-masses  Рік тому

      согласен с вами. Раньше компьютеры были проще :)

  • @guiltyshoes
    @guiltyshoes Рік тому

    Странно, когда я запускал этот код он у меня не работал быстрее чем просто rsqrt. В Doom 3 например разрабы уже этот хак не используют.

    • @math-to-masses
      @math-to-masses  Рік тому

      Тут в комментариях много было холивара на эту тему :)
      Короткий ответ - да, вы правы, современные компьютеры поддерживают подобные оптимизации на уровне железа, так что сейчас добиться реального прироста сложно. Мой код проверялся на виртуальной машине, максимально приближенной к той, что была в 99м. Сейчас этот хак уже не так актуален

  • @karantindead
    @karantindead Рік тому

    очень круто! да! старый id молодцы)))
    В Дейва, Кина и Квейки порой поигрываю)

  • @shiftingsandsgames
    @shiftingsandsgames Рік тому

    интересный факт:
    с константой 0x5F3759DF получаем неточность около 0.175%, которая потом падает
    Chris Lomont вывел вот такую константу 0x5F375A86 и неточность после первой итерации составляет уже 0.09%

  • @misleprestypnik
    @misleprestypnik Рік тому

    А я всегда так программирую. Гадаю до талого, а потом говорят гений..)

  • @alexromanov559
    @alexromanov559 Рік тому

    Представляю какой у вас шок будет, когда кто-нибудь разберёт код из времён классической демосцены. ) Некоторых современных т.н. "программистов" может часом и удар хватить.

  • @kirixoto
    @kirixoto Рік тому

    зашёл сюда ради quake

  • @ИванПиманкин-ш4п

    Не понял, откуда взялось число 127 для "реального" представления числа Е.

    • @math-to-masses
      @math-to-masses  Рік тому

      Об этом можно посмотреть в другом видео на этом канале.
      ua-cam.com/video/qJwkkUyS1WU/v-deo.html
      Там подробно рассматривается формат хранения данных float и обсуждается, почему из порядка вычитается 127, а к мантиссе прибавляется 1.
      Если совсем коротко отвечать на ваш вопрос: то так устроен стандарт :)

    • @ИванПиманкин-ш4п
      @ИванПиманкин-ш4п Рік тому +1

      @@math-to-masses чем рилтайм освещать перевод числа в двоичную систему счисления, лучше бы коротко упомянули про 127. Никаких отсылок про это. Даже на видос из вашего комментария выше. При том, что в нём тоже про перевод числа в двоичную систему рассказывается.
      Тема интересная. Спасибо.

    • @MrLolthe1stDevChannel
      @MrLolthe1stDevChannel Рік тому

      @@ИванПиманкин-ш4п можно просто почитать IEEE 754

  • @abrajmek_zalilov
    @abrajmek_zalilov Рік тому

    Классный видос! Спасибо, Антон. Посоветуй пожалуйста какой-нибудь ресурс (ну или бук) по теме вычислительных алгебры и геометрии.

    • @math-to-masses
      @math-to-masses  Рік тому +1

      Уф, это сложный вопрос. Перечисленные вами темы очень обширны.
      Я точно могу посоветовать книгу Волков - численные методы. На этом канале будут штуки из этой книги рассказываться

  • @AlexD-lc2nx
    @AlexD-lc2nx Рік тому

    Сам Кармак говорил, что этот хак притащил кто-то. Поэтому не смотря на всю его гениальность, разработчики легендарной кваки не причем

  • @bsprspktvnk
    @bsprspktvnk Рік тому +5

    зря я математику прогуливал :D

  • @denyspopov6367
    @denyspopov6367 Рік тому

    А кто-то пробовал приведённый код в видео 0:50 и далее проверить на корректность возвращаемых данных?) Там из-за не совсем корректного/верного использования одной и той же переменной возникает ошибка в вычислениях... в строчке перед возвратом:) Кому не лень, подставте в функцию 4.0... она выдаёт 0.697425 вместо 0.499154

  • @serferinterneta
    @serferinterneta Рік тому

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

    • @math-to-masses
      @math-to-masses  Рік тому

      Да, суть в том, что мы жертвуем точностью, но вычисляем быстрее. Оказывается, что так можно сделать не для любой операции. Например, не получится таким вот образом оптимизировать вычисление какого-нибудь синуса от числа. А для вычисления корня математика нашлась

    • @serferinterneta
      @serferinterneta Рік тому

      @@math-to-masses И хорошо что так, а то многие игры требовательны к ресурсам, а подобная оптимизация помогает требования снизить.

  • @delafrog
    @delafrog Рік тому

    хм... вот насчёт того, что этот алгоритм может переплюнуть оптимизации которые нынче используются при вычислениях подобного рода - в этом сомнения. Во всяком случае, у меня получилось, что в release режиме сборки кода (VisualStudio2022, Intel core I7) использование стандартного 1/sqrt(x) на массиве из миллиона случайных чисел работает примерно в 2 раза быстрее, чем использование этой оптимизации. В debug режиме отрыв не столь большой, но все равно стандартный вызов чуть быстрее.
    Я думаю, что дело в оптимизациях и аппаратной поддержке базовой арифметики.

    • @math-to-masses
      @math-to-masses  Рік тому

      Да, вы правильно понимаете - тут самый большой вопрос в аппаратной части. У меня на машине оптимизация работает раз в 5 быстрее

  • @yohohowowowo9471
    @yohohowowowo9471 Рік тому

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

    • @math-to-masses
      @math-to-masses  Рік тому

      Нет, это всегда зависит от задачи. Такой спопосб даёт погрешность в сотых от числа. Иногда это может быть критично. Так что так можно делать только тогда, когда высокая точность не нужна

  • @alexpar6279
    @alexpar6279 Рік тому

    Подскажите название игры
    Малым в нее рубился

  • @VladVinetskiy
    @VladVinetskiy Рік тому

    Ты обожаешь эту игру?

  • @naxaH200
    @naxaH200 Рік тому +4

    интересно что подобные моменты критически важны для работы на ограниченных мощностях. Во времена этих 99х годов это было очень к месту. В наши годы же железо хорошо справляется и со сложными операциями.
    Сейчас это все потыкать и прочувствовать можно на слабеньких платах, типа ардуинок, esp, stm, когда есть реально ощутимое ограничение на количество вычислений.
    И вот ты в какой то момент ловишь себя на том, что на куче листов представляешь необходимые тебе значения в виде нулей и единиц, а вместо делений и умножений пытаешься переписать все действия на битовых сдвигах, кратности двум, переходу к 8-битным целым вместо 16х и 32х или плавающих точек и тому подобное. В этом есть свой шарм и увлеченность, понимаю ребят из ID)

    • @Eugene-Polyakov
      @Eugene-Polyakov Рік тому

      "В наши годы же железо хорошо справляется и со сложными операциями." по этому у нас каждая первая игра лагает.

    • @Tikrong
      @Tikrong Рік тому +2

      Не согласен. Тот же DLSS, как и современные реализации рейтрейсинга, и большинства графических наворотов - это попытки упрощения и срезания углов, чтобы меньшими вычислениями добиться крутой картинки.

  • @mikaragua5854
    @mikaragua5854 Рік тому

    Автор хорош

  • @noble_lemon
    @noble_lemon Рік тому

    Всё. Дайте математикам делать игры и они перевернут эту индустрию с головы на ноги.

  • @artnone1257
    @artnone1257 Рік тому

    Логарифмы простые их я до сих пор помню, а вот с первородными и пределами беда там где фигурная ф в общем

  • @D0Ct0Rran
    @D0Ct0Rran Рік тому

    Сравнение по времени не совсем корректное, даже если опустить возможные оптимизации на уровне CPU, скорее всего вычислять корень придется для множества чисел, а значит для вычисления во float можно использовать векторизацию (если переписать код с развернутым циклом умный компилятор gcc со включенной оптимизацией даже сам сможет это сделать), что ускорит выполнение операций еще в ~8 раз. Так что быстрый обратный корень давольно давно потерял свою актуальность, вопрос даже насколько он был актуален в момент написания, т.к. уже тогда появлялись SIMD инструкции (тот же 3dNow! уже имеет PFRSQRT, а вышел аж в 98).

  • @ivanalifirenko3782
    @ivanalifirenko3782 Рік тому

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

    • @TsMunch
      @TsMunch Рік тому

      Не совсем верно, ускорение почти всегда не интересует потому что за него не платят, а не потому что не знают математику.

  • @herardpique7302
    @herardpique7302 Рік тому

    я думал кваку вообще на ассемблере написали

  • @spamcolector
    @spamcolector Рік тому +2

    Чувак начал ти неплохо. Развивайся, улучшай контент и не теряй свой стиль і вкус. А ми подержим❤

  • @ПетрФомин-щ9ж
    @ПетрФомин-щ9ж Рік тому

    хороший ролик. тока ИМХО формулы и вычисления надо на холсте держать и не скрывать пока не станет ясна суть.

  • @alexefremov4158
    @alexefremov4158 Рік тому

    Понравилось! А насколько сложнее код если нужны числа double, а не float?

    • @math-to-masses
      @math-to-masses  Рік тому

      Спасибо :) На самом деле разница будет только в том, что в формате double из порядка надо вычесть не 127, а 1023 (у double на порядок выделяется 11 бит, а не 8, соответственно там будет не 2^7, а 2^10), а также вместо 2^23 нужно подставить 2^52 (потому что на мантиссу там 52 бита, а не 23). Так что изменится только вот эта сама волшебная константа 0х5f3759df, а остальное будет точно так же всё

    • @sleirsgoevy
      @sleirsgoevy Рік тому

      а смысл? там точность такая низкая что от замены float на double ничего не поменяется

    • @alexefremov4158
      @alexefremov4158 Рік тому

      @@sleirsgoevy Да кто сейчас считает на float? большинство машин 64 битные.Вся встроенная математика С, С++ или С# Math или СMаth ориентированы на операции с double .Более того (по слухам, тут я не уверен) - процессор на самом деле ВСЁ скрытно считает в double, а пользователю под заказ выдает как бы float. А то что точность этого хитрого подхода невелика - ну да, верно. Вопрос - удасться ли сохранить более высокое быстродействие по сравнению с библиотечным double Sqrt(double x)?

    • @math-to-masses
      @math-to-masses  Рік тому

      @@alexefremov4158 да, с этот способ всё равно быстрее даже с даблом. Другое дело, что дабл обычно используется для повышения точности, а наш способ выдаёт погрешность уже в сотых.
      О том, что комп всё считает в даблах вместо флоатов - это не совсем так. Правильнее сказать, что современным компам не важно, с чем работать, с тем или с другим (с точки зрения скорости работы)

    • @alexefremov4158
      @alexefremov4158 Рік тому +1

      @@math-to-masses Вычитал в сети нечто такое: 1) "Intel в FPU всегда используется 80-bit precision, а результат потом просто округляется до нужного." и 2) "На некоторых процессорах double вообще не поддерживается аппаратно." Складывается впечатление, что попытки работать напрямую с битами чисел плавно исчезло за горизонтом. Если когда-то писали на С с ассемблерными вставками, то сейчас в них нет никакой нужды.

  • @mr.i3298
    @mr.i3298 Рік тому

    Не приведёт ли эта оптимизация к UB? Просто некоторые пользователи сети считают иначе

    • @math-to-masses
      @math-to-masses  Рік тому

      Формально *(int*)(&x) - можно считать UB для современных стандартов c++. Конкретно на G++ - это не UB. Но может найтись компилятор, который скажет, что это UB

    • @mr.i3298
      @mr.i3298 Рік тому

      @@math-to-masses да, я про это же. Не логичнее reinterpret_cast? А так - полнейшее нарушение strict aliasing

    • @math-to-masses
      @math-to-masses  Рік тому

      @@mr.i3298 конечно, на современных машинах лучше reinterpret_cast. Код из видео писался на С, там только такие касты есть. Сейчас игры на С, конечно, уже не пишут - сейчас пишут на плюсах и там уже, конечно, "православно" делают

  • @АлександрВласов-д5ш

    Говорят создатель продал душу дьяволу за этот алгоритм. А потом кармак нашел его исходники и стырил себе.

  • @traxen0s
    @traxen0s 10 місяців тому

    Вот они гигачады из id, до которых мне далеко, к сожалению😢

  • @pmak6074
    @pmak6074 Рік тому

    Так-так-так. Видео полезное, но немного истории:
    лайфхак, который использовал Кармак, был придуман в 1989 году, одним американским математиком и информатиком, занимавшимся оптимизацией вычислений на ЭВМ. Метод был запатентован им-же. Поэтому при всём моём уважении к Кармаку, метод он подсмотрел на 100%, т.к. уже становился доступен интернет, и научные публикации можно было читать без похода в библиотеку. Поэтому как-то так, для исторической справки.

    • @math-to-masses
      @math-to-masses  Рік тому

      за 10 лет до квейка? ОгО! Я был готов к тому, что это было придумано за год, ну за два до них, но на десять! Офигеть! Спасибо за информацию :)

  • @papacrow3854
    @papacrow3854 Рік тому +10

    Эх... Как же раньше было приятней работать программистом. Придумываешь всякие такие "Простые" гениальные штуки, и радуешься.

    • @neg0dnick769
      @neg0dnick769 Рік тому

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

    • @papacrow3854
      @papacrow3854 Рік тому

      @@neg0dnick769 да в том то и дело. Чем дальше, тем больше уже придумано. Но это можно испытать порешав задачи из проекта эйлера (допустим там первую задачу решило миллион человек, а есть задача, которую только 50 решили)

  • @n0kkster
    @n0kkster Рік тому +3

    действительно интересный ролик, но вот подборка цветовой гаммы меня немного напрягла (например, на моменте 7:05). у меня лично от такого синего цвета начали болеть глаза. так что, пожалуйста, автор выбирайте более приятные для глаза цвета (flat ui цвета, например) тогда смотреть ролики будет куда приятнее. спасибо!

    • @leptosomic
      @leptosomic Рік тому

      Ролик про олдскул. Именно такие цвета были в средах разработки от Borland. Автор не только рассказал про 99 год, но и визуально вернул туда тех, кто застал. Мне эта отсылка была весьма приятна.

  • @МаксимСтрачилов

    Сделайте людям ещё видео про CORDIC:)

  • @SCXBelka
    @SCXBelka Рік тому +1

    Часть с m e замудреная. Но я не вникал. В целом сам факт что простую линию приблизили к логарифму от 0 до 1 забавляет! Ещё бы историю как они это так сделали, читал что один спросил второго, а второй спросил третьего, а третий ничего не помнит так как был обгашен или пьян.

    • @pmak6074
      @pmak6074 Рік тому

      Элементарно спёрли это у математика, который запатентовал метод: причём метод строился на развитии идей "деления умножением." Поэтому, всё что там заявляют пиарщики id (или сами id) - красивые сказки для лопухов. Типа "тихо сп*здил и ушёл, называется изобрёл)", а как я это это сделал, - да хрен знает, - гашеный был. Отличная отмаза

  • @QuickOkay
    @QuickOkay Рік тому

    Может я что-то не так делал, но когда я пробовал данный метод, он оказался на порядок медленнее, чем sqrt из стандартной библиотеки c++. Хз почему, особо вникать не стал

  • @alexsh2045
    @alexsh2045 Рік тому

    хм ну здорово конечно. Но это все же жесткий костыль ахаха хотя бы дали именование константному значению

  • @programm1ct
    @programm1ct Рік тому +1

    Подписался)

  • @yeetrpg
    @yeetrpg Рік тому

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

  • @МВолков-с6ж
    @МВолков-с6ж Рік тому +1

    Жаль что сегодня так не оптимизируют, а то играли бы киберпанк на ультрах в 4к 500 фпс на rtx3050. Утрирую конечно, но ход мысли думаю понятен. Сам я в свободное время разрабатываю движок, и как оказалось, на моем древнем железе пентиум Е6600 и 9800GT можно такие вещи вытворять, что Хуангу не снилось, хотя к сожалению на мать не ставится больше 4 гигов оперативы в двухканале, ддр2 же, че поделаешь.

    • @leptosomic
      @leptosomic Рік тому +2

      Покажете?

    • @МВолков-с6ж
      @МВолков-с6ж Рік тому +1

      @@leptosomic Конечно, с превеликим удовольствием! Но он ооочень сырой и обращаться с ним умею только я. Так как я всего лишь один человек, а не команда, от меня не стоит ждать что-то типа Unreal Engine 5. И даже интерфейса нет, еще не сделал. А приходиться делать движок по частям, а именно, графику отдельно, физику отдельно, интерфейс отдельно, остаётся ещё и работа с сетью и ИИ и т. д. И всё это надо потом как-то соединить, а сеть и ИИ я ещё даже не начинал, так как пока что в этом вообще не шарю, думаю, что наверно закажу алгоритм у опытных людей. Да я вообще новичок и нигде не учился, всё что у меня есть, это амбиции и стремление)) А самое главное, меня завораживает этот древний 775-сокет, не могу от него оторваться, я как-будто околдован, я столько раз хотел обновиться на новое железо, но в своё время не смог, всякий раз были проблемы, в том числе и недавние Ковид с майнингом, отношение Хуанга к своим клиентам (имеются в виду геймеры), что окончательно отбили желание к ПК-геймингу. Я купил наконец-то смартфон и начал в них разбираться, ща играю Фри фаер. Но я не отпустил руки, так как очень хочу доказать, что ещё не все соки выжаты из этого паст-ген железа, а разработчики игр забили болт на оптимизацию и поддержку софта на старом железе и тупо перешли на новое следуя маркетингу. То есть ещё можно делать шедевры на старье, по крайней мере я так думаю. Движок ещё не закончен, так как надо заниматься ещё банально и насущным хлебом, работать, так сказать, а кодинг это хобби, точнее один из хобби. Но есть ещё одна проблема на данный момент - я наконец-то продал комп... А 775-х матерей уже трудно найти даже на вторичке, хотя когда-то был момент, что их на помойках и свалках находили, притом в рабочем состоянии, хоть попой жуй, а сейчас их редкие барыги как раритет продают, мягко говоря по завышенной цене)) Но и это не самая главная причина. А главная причина это моё стеснение. Но раз зашли так далеко, так придётся уже сказать. Тсссс, тихо! Если об этом узнают программисты, они пошлют меня оочень далеко, за тридевять земель, это тааакоой трэээш!)) Короче, я пишу... знаете на чём? На Delphi 7! Уфф, прям от груза избавился! Да, это самая ненавистная и тормознутая среда которую терпеть не могут уважающие себя программисты, так как она предназначена для инженеров, а не для этих самых программистов. Но а я плевал на всякие Си плюс плюсы и Джаву, я самым первым ещё в школе научился писать на Паскале и в этот синтаксис влюблён до гроба! И я намерен идти до конца. Оказалось, есть куча вещей, которых надо исправить, например, так как я новичок, я писал всё на integerе))) А это оказывается тупо разбрасывание памятью направо-налево! Ща профессионалы делали бы фейспалм, читая это)) Значит надо использовать байты, а ещё лучше побитовые функции, но тогда придётся углубиться до Ассемблера, а в идеале - знать некоторые машинные коды и чистить мусор в регистрах. Вот уж тогда, думаю 775 точно восстанет из мёртвых!)) Нет, я согласен перейти на нормальный, "человеческий" язык, например Си++ или Си#, но при условии, что синтаксис будет Паскалевским. Вот так вот.

    • @МВолков-с6ж
      @МВолков-с6ж Рік тому +1

      Забыл упомянуть, я остановился на физике, точнее на разрушаемости объектов, хотя есть такие игры, забыл названия, разрушаемость там - Майкрафт курит в сторонке, но у них хромает графика, так как требует больших ресурсов, а например, Батла имеет шикарную графику, но физические разрушения в основном, заскриптованы и обычному игроку незаметны, а дотошные Сталкаши разберут их в пух и прах. То есть приходится выбрать либо вид, либо функционал. А я хочу их объединить их, притом оптимально, чтобы фпс был в пределах разумного. Я много видосов посмотрел про всякие SSAO, MSAA, анизотропную фильтрацию и много других, есть очень классный парень, автор канала Alek OS, еще Onigiri и Вектозавр. Кстати, я буду применять векторную 3Д графику, а текстуры будут использоваться только на стадии разработки игры, а в готовой игре их не будет. А проблема, из-за которой нельзя собрать команду разработчиков такая: я не могу всю мою идею им рассказать как есть, вот очень кстати подошёл бы нейралинк от Илона Маска, я бы свою мысль за считанные секунды передал бы команде)) Вот такие вот дела...

  • @yujinnya
    @yujinnya Рік тому

    Нашел видео Nemean'а (у которого 3.8 млн просмотров за 2 года) и решил по-быстрому запились контент? Или просто перевод для тех, кто не умеет в английский?

    • @vlcdn
      @vlcdn Рік тому

      Как будто только в том видео есть объяснение. :)

  • @rotsaatkrahe7178
    @rotsaatkrahe7178 Рік тому

    е = Е - 127, почему именно 127?

    • @math-to-masses
      @math-to-masses  Рік тому

      об этом говорится в видео, указанном в аннтоациях - про хранение числа с плавающей точкой. Если коротко, то так устроен формат float - мы хотим уметь хранить и положительный порядок, и отрицательный. Всего 8 бит выделяется на порядок. То есть это числа от 0 до 255. Половина должна быть отдана на положительный порядок, а половина - на отрицательный. Поэтому граница проходит по числу 127, как половина от 255

    • @rotsaatkrahe7178
      @rotsaatkrahe7178 Рік тому

      @@math-to-masses Спасибо большое, канал большая находка!

  • @nektoriy8665
    @nektoriy8665 Рік тому +2

    АААААААААААААААААААААААААААААААААААААААААА. Извините.

    • @nektoriy8665
      @nektoriy8665 Рік тому +2

      Отличное видео! Надеюсь, что когда-то в будущем я его пойму.

  • @israinddertou5973
    @israinddertou5973 Рік тому

    ua-cam.com/video/p8u_k2LIZyo/v-deo.html - знакомое видео? Нет?

  • @Ivan_Balakirev
    @Ivan_Balakirev Рік тому

    Ничего не понятно, надо разбираться

  • @mopodep
    @mopodep Рік тому

    Ид-софтвер - всегда держали марку - хорошей и качественной оптимизации. Разбор действительно хороший)
    (так-же восхищает количество представительниц прекрасного пола в комментариях.. - Не поделитесь статистикой - сколько вообще из них, просмотрели ролик в % соотношение...(я не сексист Т_Т))

    • @math-to-masses
      @math-to-masses  Рік тому

      1% зрителей этого видео - девушки. А всего на канале 2% зрителей - девушек :)
      Возможно, ютуб меня рекомендует только суровым мужикам :)

    • @mopodep
      @mopodep Рік тому

      @@math-to-masses Достойно :)) Настоящее сообщество гик-задр...тов.....:))

  • @olegvoron6847
    @olegvoron6847 Рік тому

    Какой же я тупой... T___T

  • @unclechayka1178
    @unclechayka1178 Рік тому

    Оптимизация кода 80 уровня

  • @Fregatte86
    @Fregatte86 Рік тому

    Контент по квейку 3 и программирование. Это что сказка?