Architec.Ton is a ecosystem on the TON chain with non-custodial wallet, swap, apps catalog and launchpad.
Main app: @architec_ton_bot
Our Chat: @architec_ton
EU Channel: @architecton_eu
Twitter: x.com/architec_ton
Support: @architecton_support
Last updated 2 weeks, 2 days ago
Канал для поиска исполнителей для разных задач и организации мини конкурсов
Last updated 1 month ago
*? 200 тыс. шуток, вебсокеты и Gemini: История одного обновления ?*
Многие тут помнят, что в свободное время я делаю юмористическую игру для друзей PunchMe. Устроено всё так: собираетесь с друзьями в игровой комнате, каждому дают по началу шутки которую надо смешно закончить, потом все хихикают и голосуют у кого веселей вышло.
Делал первую версию чтобы играть с друзьями, но проект стал достаточно популярным и игроки уже написали порядка 200k панчлайнов.
Так вот, хочу рассказать о гигантском обновлении PunchMe
Чистый новый интерфейс
Прекрасный новый минималистичный UX/UI дизайн сделал Илья. Оживили и сверстали фронт Вова с командой на VueJs + Tailwind.
Можно играть со своими иностранными друзьями
Добавил поддержку английского в интерфейсе + есть англоязычный пакет вопросов. Работает даже озвучка.
Панчетрон ещё смешнее
AI бот, который играет с вами, теперь на голову смешнее предыдущей версии. Основной буст произошёл от перехода с gpt4 на gemini, который прекрасен на русском и, на удивление, не сдерживает себя в политкорректности. Иногда даже краснею за него.
Новый пакет: вопросы с никами
Часто с друзьями играли, когда в заходах для шуток (сетапах) были имена друзей. Очень весело. Хардкодил раньше этот режим вручную, теперь добавил эту функциональность при создании комнаты.
Всё работает быстрее на вебсокетах и асинхронно
Бек и фронт перевёл с rest-api на вебсокеты. Переписал весь код на асинхронный (flask → fastapi). Всё стало работать бодрее.
Бекэнд теперь организован
Перешёл с sqlite на mongo, который очень удобно поднимать с помощью докера. Сам бекенд и сборка фронта теперь тоже живут в своих контейнерах. Прокачал тут свой докер скилл.
? Alma Mater Folder ?
Ребята-физтехи организовались и сделали папку классных телеграм каналов. В которой я тоже есть ?.
Много ребят C-уровня: фаундер Skyeng, CEO Epic Growth, VP в Osome, CPO в Яндекс.Лавке, etc.
Рекомендую заценить! Кучу интересного: много мейкеров (кто пилит свои проекты), датасаенс конечно же, истории про создание настольных игр и многое другое на что можно залипнуть.
Telegram
Физтехи
Mikhail Kozyulin invites you to add the folder “Физтехи”, which includes 48 chats.
? Как считать экспоненту с помощью умножения и сложения ?
```
const int L = 1 << 23; // == 2^23
const float a = L / std::log(2);
const float b = L * 127;
float fastExp(float x) {
x = a * x + b;
return std::bit_cast((int)x);
}
```
Выше упрощенная версия кода, который считает приблизительное значение экспоненты, который я недавно встретил на GitHub.
Я был супер удивлен, что тут умножение + сложение + преобразование типов, и всё — экспонента подсчитана.
В моей голове экспонента всегда была нетривиальной операцией, на которую требуется много тактов. Как же так, давайте разбираться.
Целые и дробные числа хранятся в битах по-разному
Числа в формате int хранятся ожидаемым образом, например, для числа 123:
123: int = 0000000000000000000000000 1111011
Числа в формате float хранятся в виде маски битов:
s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
s — 1 бит знака. Определяет, положительное число или отрицательное.
e — 8 битов экспоненты. Показывают степень двойки.
m — 23 бита мантиссы. Хранят дробную часть числа.
Само число = (-1)^{s} * 2^{e} * 1.{m}
Например для нашего числа 123:
123: float = 0 00000110 11101100000000000000000
e = 00000110b = 6
m = 0.1110110b = 0.921875
Проверяем: 2^{e} x 1.{m} = 2^6 x 1.921875 = 123. Сходится!
Переводить представления из int в float и обратно несложно, и процессор умеет делать это очень эффективно.
Чтобы понять суть алгоритма, вместо e^{x} будем считать 2^{x}
Считаем быстро 2^{x} если x - int
Заметим, что если мы знаем двоичное представление x, то если мы его засунем в биты экспоненты float, то задача уже решена (e = x, m = 0). Это ключевое наблюдение для понимания алгоритма!
В int представлении все биты числа x у нас хранятся в правом конце числа. Чтобы сдвинуть их в область экспоненты, мы умножим наш int x на 2^23. Тем самым просто допишем 23 нуля справа.
В этих двух идеях и есть вся суть. Как перейти от 2^{x} к e^{х} в других деталях можно разобраться самому или заглянуть в оригинальную статью.
Cчитать экспоненту в десятичной системе мы (человеки) тоже можем с помощью одного умножения (wow!)
Например, чтобы оценить exp(36) мы можем переписать
exp(36) = 10^{36 * log10(e)} = 10^{15.634} ~ 10^16
Эта неожиданная похожесть алгоритмов, получается из-за того что научная запись чисел вроде 5.34e7 очень похожа на то, как хранятся float в компьютере.
P. S. На самом деле степень двойки в экспоненте float сдвинута на 127, чтобы мы могли записывать как большие числа, так и очень маленькие. Мы учитываем этот сдвиг, добавляя b = L * 127
. Я убрал его, чтобы он не отвлекал от основной идеи.
P. P. S. Для тех кто всё понял: почему умножение на 2^32 в коде происходит в float, а не в int и что происходит с мантиссой в этом случае?
? Задачка по битовой магии ?
```
const int L = 1 << 23; // == 2^23
const float a = L / std::log(2);
const float b = L * 127;
float fast_math_function(float x) {
x = a * x + b;
return std::bit_cast((int)x);
}
```
Выше упрощенная версия кода который считает приблизительное значение некоторой стандартной математической функции. Из действий тут только умножение + сложение + преобразование типов. А результат получается супер нетривиальный!
Вчера я потратил значительное время чтобы полностью понять как это работает эта магия. Расскажу о ней в следующем посте.
А пока два вопроса:
- Что это за функция?
- Как и почему работает этот магический код?
*✍️ Небольшое обновление Chess Brain Scorer из предыдущего поста ✍️
Починил подсчёт рейтинга. При решение большого числа задач рейтинг считался неправильно и улетал в небеса. Удивительно, но баг в js библиотеке glicko2, которой уже 8 лет. Чтобы пофиксить пришлось самому написать оценку волатильности рейтинга.
* Добавил комментарии к истории, чтобы можно было что-то отмечать про своё состояние.
Architec.Ton is a ecosystem on the TON chain with non-custodial wallet, swap, apps catalog and launchpad.
Main app: @architec_ton_bot
Our Chat: @architec_ton
EU Channel: @architecton_eu
Twitter: x.com/architec_ton
Support: @architecton_support
Last updated 2 weeks, 2 days ago
Канал для поиска исполнителей для разных задач и организации мини конкурсов
Last updated 1 month ago