Практика языка C (МФТИ, 2023-2024). Семинар 6.4. Представления плавающих чисел и ассемблер x86.

Поділитися
Вставка
  • Опубліковано 16 лис 2024

КОМЕНТАРІ • 50

  • @ds9410
    @ds9410 7 місяців тому +3

    Смотрится, как хороший фильм с закрученным сюжетом. Никогда не знаешь, что тебя ждёт за углом. Cliffhanger 10/10.

  • @MikhailGoncharov-tl4cr
    @MikhailGoncharov-tl4cr 7 місяців тому +6

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

  • @loverock8384
    @loverock8384 7 місяців тому +10

    Благодарю за лекцию ❤

  • @саняпух-ж4р
    @саняпух-ж4р 7 місяців тому +2

    Интересные лекции! Хоть и базовую часть знаешь, но юморок своё дело делает - фокус не теряется, так как не нуДно)

  • @Вовик-д5л
    @Вовик-д5л 7 місяців тому

    спасибо, попозже посмотрим обязательно)

  • @MVZ1983
    @MVZ1983 6 місяців тому +1

    ну и про union не забываем если нужно представить float как unsigned

    • @tilir
      @tilir  6 місяців тому +1

      Не используйте type punning.

  • @wusikijeronii4510
    @wusikijeronii4510 6 місяців тому

    По поводу кастинга - я понимаю почему кастинг не будет работать в случае кастинга в сторону не char. Т.к. он формирует выходные данные с учётом репрезентации типа. Но помимо char* существует ещё и void* который гарантирует что репрезентация будет исходной. Я бы прости приводил к void* и затем к dst.

  • @bigtown2012
    @bigtown2012 3 місяці тому

    Жалко два лайка нельзя поставить)

  • @jcy4691
    @jcy4691 7 місяців тому

    на тему извлечения битов: верно ли что union {float f; unsigned u;} это по сути тот же каст адреса и то же уб? И может ли в теории возникнуть ситуация, где каст/юнион и memcpy дадут разный результат?

    • @tilir
      @tilir  7 місяців тому +2

      Нет это т.н. type punning. У него более спорный статус. Его то запрещают то разрешают. Лучше им не пользоваться никогда. Но это не имеет отношения к strict aliasing.

  • @Денис-ь8ь7с
    @Денис-ь8ь7с 4 місяці тому

    Можно ли для получения битов float в int использовать reinterpret_cast вместо memcpy? Без указателей, просто интерпретировать значение. Если нет, то почему?

    • @tilir
      @tilir  4 місяці тому

      Нельзя т.к. это strict aliasing violation

    • @Денис-ь8ь7с
      @Денис-ь8ь7с 4 місяці тому

      @@tilir но… memcpy чем лучше? )
      мы обманываем просто компилятор?
      По итогу ведь и так и так получаем копию битового содержимого.

    • @tilir
      @tilir  4 місяці тому

      @@Денис-ь8ь7с наоборот. С помощью memcpy мы НЕ обманываем компилятор.

    • @Денис-ь8ь7с
      @Денис-ь8ь7с 4 місяці тому

      @@tilir Я подумаю над этим. Спасибо.

  • @alexloktionoff6833
    @alexloktionoff6833 7 місяців тому +1

    да, вместо abs(int) правильно реализовывать negabs(int)

    • @tilir
      @tilir  7 місяців тому

      И что эта функция должна делать?

    • @alexloktionoff6833
      @alexloktionoff6833 7 місяців тому

      @@tilirвозвращать отрицательную величину модуля аргумента, и далее работать только с отрицательными величинами, разве не так?

    • @tilir
      @tilir  7 місяців тому +1

      Интересная идея, спасибо. Я об этом почему-то раньше не думал и такой функции не встречал.

  • @Airatgl
    @Airatgl 7 місяців тому

    Для этого семинара в качестве задачи со звездочкой на дом подойдет разобрать работу алгоритму fast inverse square root из движка Quake 3

    • @tilir
      @tilir  7 місяців тому +4

      Мы будем эту задачу рассматривать но позднее. Для неё нужно понимать метод Ньютона. У нас будет отдельный семинар про научные вычисления.

  • @КарлГаусс-ъ2и
    @КарлГаусс-ъ2и 7 місяців тому

    3:00, Вами сказано "...трансцендентные числа, которые тоже вычислимы" .Это неверное утверждение.

    • @tilir
      @tilir  7 місяців тому

      В смысле неверное? Число пи трансцендентно и при этом вычислимо.

    • @КарлГаусс-ъ2и
      @КарлГаусс-ъ2и 7 місяців тому

      Константин, я не думал, что мне придётся это Вам пояснять. Но Ваше утверждение на лекции звучит, так - "Все трансцендентные числа - вычислимы", вот это утверждение неверно. Я не спорю с тем, что некоторые трансцендентные числа - вычислимы. Но я утверждаю, что почти все трансцендентные числа - не вычислимы.

    • @tilir
      @tilir  7 місяців тому +1

      ​@@КарлГаусс-ъ2и я не думал что меня именно так можно понять. Я разумеется имел в виду ту небольшую часть трансцендентных чисел которые тоже вычислимы.

  • @tarmo9010
    @tarmo9010 7 місяців тому

    А почему не используют1-байтовые float, разработчики железа, почему не делают такой функционал на cpu gpu? К примеру для расчета цвета пикселей c simd. Ведь по факту точность для 256 значений не важна в многих случаях.

    • @tilir
      @tilir  7 місяців тому

      А почему бы для пикселей не использовать однобайтовые целые?
      Там где короткие floating point числа обоснованы -- в нейросетях например -- их делают. Всякие там bfloat16 и всё такое.
      Но серьёзное обоснование именно для восьми бит с плавающей точкой (а сколько на мантиссу?) мне не встречалось.

    • @victormustya1745
      @victormustya1745 7 місяців тому

      ​@@tilir как раз в AI сейчас модно не только 8-bit float (2 вида, s1e4m3 и s1e5m2), но даже и 4-bit float (s1e2m1). Но за пределами AI они не очень-то применимы.

  • @Stedmiel
    @Stedmiel 7 місяців тому +1

    51:22 ну как можно было пропустить такую возможность оставить студентам 1.5f часа? 😆

  • @_dzen_tv_
    @_dzen_tv_ 7 місяців тому

    Разве не около ±1-цы наибольшая плотность чисел т.к. экспонента минимальна.
    А промежуток между -float_min и +float_min вообще выпадает, кроме нуля(ну это исключение).
    Либо около min всё таки?

    • @tilir
      @tilir  7 місяців тому

      Вы не учитываете денормализованные числа.

    • @_dzen_tv_
      @_dzen_tv_ 7 місяців тому

      @@tilir
      Как раз про денормализованные числа речь.
      format | MINVAL (subnormal)
      binary32 | 1.40·10−45
      binary64 | 4.94·10−324
      Наводит на мысль что мы приближаемся к нулю, но не достигаем его. Функция f(x) = 1/x

    • @tilir
      @tilir  7 місяців тому

      Для нуля есть представление "все нули" так что достигаем. Распределение чисел не гиперболическое, а скорее экспоненциальное, но не совсем из за артефактов представления.

  • @АлександрПетров-г8о1н
    @АлександрПетров-г8о1н 7 місяців тому

    .1 0.5 .01 0.25 вещественные числа точно представляемые в эвм

    • @tilir
      @tilir  7 місяців тому

      Вы угадали ровно половину. 0.1 не может быть точно представлено в ieee754, у меня на видео есть пошаговое приближение. Найдите у себя вторую ошибку ))

    • @АлександрПетров-г8о1н
      @АлександрПетров-г8о1н 7 місяців тому

      я не отдупляю почему 0.1 не точное представление .5 @@tilir

    • @tilir
      @tilir  7 місяців тому +1

      Потому что 0.1 это (1 / 10), а 10 это не степень двойки.

  • @sibedir
    @sibedir 7 місяців тому

    1:34:30 а разве он это сделал ни для того, чтобы выравниться по кэш-линии? 4*16 - как раз 64. То есть за одну итерацию мы гарантированно ни разу не промахнёмся через кэш. А значит современный процессор сделает эти 4 сложения за 1 такт. Или я что-то совсем перемудрил?

    • @tilir
      @tilir  7 місяців тому +1

      Про кеши будет через пару занятий, мы их пока не проходили. А так да, это взаимосвязано.

    • @sibedir
      @sibedir 7 місяців тому

      @@tilir и про кэши будет ☺️ Как всё вкусно

    • @normanmaddyson8408
      @normanmaddyson8408 7 місяців тому +1

      @@sibedir за один такт он их не может сделать, там же зависимость от предыдущих вычислений в xmm0. В примере с fast-math оно хорошо ложится на конвейнер, потому что результаты независимы друг от друга, но конвейер не означает идеальную параллельность (можете почитать в википедии).
      Так же латенси floating point инструкций далеко не 1 такт (llvm-mca на моем процессоре показывает 8 тактов для movups и 3 такта для addps)

    • @sibedir
      @sibedir 7 місяців тому

      ​@@normanmaddyson8408а, ну да 🤦‍♂️ тупанул. Это же сумма в один регистр.
      И про 1 такт, тут не верно я сказал. Конечно же имелось в виду, что 4 разом выполнятся.
      Спасибо, что поправили.

  • @DART2WADER
    @DART2WADER 7 місяців тому

    memcpy куда нибудь.