• Почему не существует не итерационных/точных методов для вычисления корня из числа?

    @Mercury13
    Программист на «си с крестами» и не только
    Всё крайне просто.
    Потому что, начиная с рационального числа и проводя четыре арифметических действия, +−×: , мы будем оставаться в поле рациональных чисел. А корень в большинстве случаев иррациональный.
    Мы можем получить лишь рациональное число, достаточно близкое к нашему корню.
    И все «нормальные» методы вычисления корня работают так: если ещё немного повычислять, можно получить более точный корень. То есть итерационные.

    Пример НЕитерационного метода предложили Ын, Уолш и Таролли, но более он известен по игре Quake III: придумать приближение логарифма, разделить на 2 и обратить это самое приближение. Но этот метод не масштабируем: если точности не хватает, придётся брать в руки какой-нибудь метод Ньютона и дотягивать точность. Ну или придумывать более точное приближение логарифма — исходное было всего лишь прочтением компьютерного дробного как целого числа. То есть придётся рубить его на мантиссу и порядок, порядок брать как есть, а мантиссу преобразовывать каким-то многочленом (если читать дробное как целое, то наш многочлен — банальная линейная функция, log₂(1+x)≈x).

    А лучше порядок превратить в несмещённый, поделить надвое, вернуть опять к смещённому, и остаётся только найти приближение — многочленом или таблицей — для x∈[1,4).

    Другой НЕитерационный алгоритм — банальная таблица. Каким-то раком предвычислить таблицу, а то, что в таблицу не попадает, приблизить любым доступным методом, да хоть линейной интерполяцией или многочленами Эрмита.
    Ответ написан
    Комментировать
  • Должно ли быть напряжение на пинах POWER SW материнской платы?

    @Mercury13
    Программист на «си с крестами» и не только
    По идее, должно. Но чем вы мерили? — там, полагаю, будут несколько вольт (скорее всего, 5), полученные подтяжкой штыря к +5SB.
    Ответ написан
    1 комментарий
  • Как именно гарантируется выделения n байт памяти библиотекой stdint.h?

    @Mercury13
    Программист на «си с крестами» и не только
    В моей версии MinGW это сделано так.
    На уровне компилятора определяется макрос __INT64_TYPE__, который на данных настройках значит long long. Затем через жёсткую препроцессорную магию определяются и остальные типы и константы, связанные с int64.

    # include_next <stdint.h>  // то есть самого себя!
    
    . . .
    
    #ifdef __INT64_TYPE__
    # ifndef __int8_t_defined /* glibc sys/types.h also defines int64_t*/
    typedef __INT64_TYPE__ int64_t;
    # endif /* __int8_t_defined */
    typedef __UINT64_TYPE__ uint64_t;
    # undef __int_least64_t
    # define __int_least64_t int64_t
    # undef __uint_least64_t
    # define __uint_least64_t uint64_t
    # undef __int_least32_t
    # define __int_least32_t int64_t
    # undef __uint_least32_t
    # define __uint_least32_t uint64_t
    # undef __int_least16_t
    # define __int_least16_t int64_t
    # undef __uint_least16_t
    # define __uint_least16_t uint64_t
    # undef __int_least8_t
    # define __int_least8_t int64_t
    # undef __uint_least8_t
    # define __uint_least8_t uint64_t
    #endif /* __INT64_TYPE__ */


    Полагаю, это связано с тем, что компилятор и библиотека сильно кроссплатформенны и написаны в большом отрыве друг от друга. Решай мы более простую задачу — то есть связку «компилятор-библиотека» для конкретной ОС — можно было просто
    typedef long long int64_t;
    Ответ написан
    Комментировать
  • Если создам сайт с рингтонами а сами рингтоны не будут это нарушение авторских прав?

    @Mercury13
    Программист на «си с крестами» и не только
    Если ссылка будет вести к рингтону — нарушение.
    Если рингтона не будет от слова «совсем» — ну, я не очень знаю, как вы, мошенники, на этом зарабатываете. Перехват поисковых запросов? Могут и прижать, но о том, что «не верблюд», придётся оправдываться в суде. Маловероятно, потому что таким спамом вы ПОМОГАЕТЕ законным распространителям. Но наши правоторговцы тупы настолько, что от них можно ожидать чего угодно.
    Ответ написан
    1 комментарий
  • Как получить цепочку кластеров занимаемых файлом?

    @Mercury13
    Программист на «си с крестами» и не только
    На то она и файловая система, что скрывает от пользователя, как устроен диск и есть ли вообще диск: может быть сетевая файловая система, могут быть устройства как файлы, а может быть RAID какой-нибудь, когда одни данные на двух дисках.

    Насколько мне известно, ни один файловый API не позволяет перейти от высокоуровневого дескриптора до низкоуровневых штучек — во-первых, неуниверсально. Во-вторых, опасно для пользовательских данных, если программа уверена, что знает, а она не знает (например, на диске MyCoolFS 3.15, а программа работает с 3.14). Все программы, работающие с файловой системой как таковой, начинают с разделов диска.

    Такая конструкция хотя бы ставит надёжные стены между пользовательскими программами (которые портят данные в крайне редких случаях — скажем, когда выключили комп во время записи) и сервисными утилитами (которые по определению опасны, используйте на свой риск).
    Ответ написан
    Комментировать
  • Когда нужен MVC, а когда API?

    @Mercury13
    Программист на «си с крестами» и не только
    API нужен, когда ожидается взаимодействие с другими сайтами и программами. Да хоть с Ведроид-прогой. В нагрузку можно сделать клиентскую часть полностью на JS, чтобы меньше повторяться — тогда это и будет ваш «сайт на API».

    MVC (применительно к вебу) — это хотите сделать рендеринг всего вывода на сервере и делите вывод на слои: этот отвечает за подготовку информации, а этот — за её вывод в HTML.
    Ответ написан
    9 комментариев
  • Какой 3D движок использует ИИ Sora?

    @Mercury13
    Программист на «си с крестами» и не только
    Подозреваю, конструкция тут другая. Смысл 3D-движка — 1) показывать сложное 3D в реальном времени, и главное в этом — отсекать невидимое и посылать видимое на видяху так, чтобы она всё это быстрее обработала; 2) иметь некие утилиты для распространённых частей игр: столкновения, камеры, риги (системы ограничений, позволяющие анимировать не кучу вершин, а, например, руку).

    Сложная картинка — опыт показал, что нейросеть со сложным освещением справляется лучше, чем 3D-движок, но чертовски неуправляема.

    Утилиты — в большинстве случаев генератору видео они мало на что нужны.

    Тут же система, возможно, и придумывает какие-то трёхмерные очертания объектов, но сильно упрощённо, на уровне второй кваки (не так-то и нужно отсечение), а затем обрабатывает результат этого 3D обычной двухмерной нейродумалкой. Пример: та самая женщина, идущая по Токио — от кадра к кадру меняется покрой её куртки.

    UPD. У них действительно есть сильно упрощённая модель трёхмерного мира, именуемая «patches». Но окончательное оформление всё равно делается обычной двухмерной нейродумалкой.
    Ответ написан
    7 комментариев
  • Как создают текстуры для игр?

    @Mercury13
    Программист на «си с крестами» и не только
    Вы, конечно, говорите о 3D. Там создают текстуры для ожидаемого разрешения экрана (2к или 4к, например), а остальное — MIP-текстурирование. Уменьшенные в 2, 4, 8 и т.д. раз версии создаются автоматически.
    Отдельный вопрос — как в текстуру втиснуть псевдо-векторную вещь, для этого используется хитрый формат текстуры и хитрые шейдеры.

    Вы можете запустить и какой-нибудь Need for Speed Porsche в 4к. Скорее всего, в каком-то месте уровня зависнет, но некоторое время работать будет. Края объектов будут резкие, за это отвечает 3D-движок. Но треугольники будет видны, а текстуры мыльные по современным меркам. Вот вам огромное превышение системных требований.

    Но в текстурах есть одно важное попущение меньшим разрешениям: между островками текстур должно быть несколько пикселей, чтобы при уменьшении не захватило соседний островок, и островки должны быть зарисованы с припуском по той же причине.
    Ответ написан
  • Как узнать что за код и как его расшифровать?

    @Mercury13
    Программист на «си с крестами» и не только
    Двоичный файл собственного формата, дополнительно закодированный в Base64. Кто такой «pony(», это ты?
    Собственного формата — это значит, его придётся декодировать из Base64, а потом ломать своими силами.
    Формат целых подозреваю Intel, но нет гарантии.
    Ответ написан
    Комментировать
  • Как сделать чтоб перснаж не мог проходить через стены?

    @Mercury13
    Программист на «си с крестами» и не только
    Если отбросить в сторону общую упоротость кода (облом делать ревизию), проблема вот в чём.
    Работая с коллайдером (фигурой, которая участвует в проверке столкновений, она же хитбокс), вы выбрали диапазон клеток
    [y / 16; (y + h) / 16).

    Например, y = 1, h = 16, (y+h)/16 = 1, диапозон [0,1), и проверяется только клетка 0. А надо 0 и 1.

    Так что надо [y / 16; (y + h - 1) / 16]. ВКЛЮЧАЯ СПРАВА.
    Ответ написан
    Комментировать
  • Как сделать чтоб одна вункция роботала всегда а другая паралельно каждую секунду?

    @Mercury13
    Программист на «си с крестами» и не только
    Итак.
    1. В играх очень хорош объектный подход — что-то вроде
    class World {
    public:
      bool wasStarPlaced = false;
      bool wasStaircasePlaced = false;
      std::vector<std::vector<char>> map;
      unsigned long long tick = 0;  // пригодится ещё
      void update();  // стандартное название для функции «исполнить игровой такт»
    };

    Тут даже не нужны все каноны ООП, достаточно что-то вроде «поле X принадлежит объекту Y».

    2. Многопоточка чревата гонками по данным, и если в многопоточку не стоит — пожалуйста, не делайте! В данном случае вы хотите что-то вроде: каждую секунду выполнять дополнительную ветку.

    Как я понял, игра динамичная, и расчёты в ней достаточно простые, чтобы вести их с постоянной частотой (например, 60 тактов/с).
    constexpr int TICKS_PER_SEC = 60;
    
    void World::update()
    {
      ++tick;
      if (tick % TICKS_PER_SEC == 0) {
         // происходит каждые 60 тактов
      }
    }
    Ответ написан
    Комментировать
  • Для кого операция добавления элемента в середину медленнее — для List или для LinkedList?

    @Mercury13
    Программист на «си с крестами» и не только
    Если нужно искать точку, куда добавить (в LinkedList переместить итератор, в List переместить итератор ИЛИ отыскать индекс) — медленнее LinkedList из-за вопросов с кэшем.
    Если точка уже имеется и она в середине — медленнее List, просто из-за асимптотической сложности.
    Ответ написан
    3 комментария
  • Возможно подключиться к домашнему роутеру через wan порт?

    @Mercury13
    Программист на «си с крестами» и не только
    Некоторые роутеры тем или иным образом позволяют — при этом указывают, через какой порт будем смотреть в сеть админкой. Не через 80 же…
    Это дыра в безопасности, по дефолту выключено, если и есть.
    Если отказал последний порт LAN, а надо настроить — зайдите по вайфаю.
    Ответ написан
    Комментировать
  • Как решить задачу "Шестерки" с меньшими затратами памяти?

    @Mercury13
    Программист на «си с крестами» и не только
    Шаг 1. Что собой представляет 66666·6?
     ₃₃₃₃
     66666
    ×    6
    ------
    399996

    Таким образом, получается N+1 цифра: 3, N−1 девятка, и 6.

    Шаг 2. Что собой представляет 66666²?
         66666
        ×66666
    ----------
        399996
       399996
      399996
     399996
    399996
    ----------
    4444355556

    (Простите уж, был обломИЩЕ, так что вычислил на калькуляторе и без цифр переноса.)

    Могут быть вопросы, если очередная сумма перескочит за 100 и перенос будет двузначным — но нет, тут всё в порядке. Посчитаем (при достаточной длине кучи шестёрок):
    Десятая с конца (!) цифра — 9·9 + 6 + 8 [перенос] = 95, перенос 9
    Одиннадцатая — 9·10 + 6 + 9 = 105, перенос 10
    Двенадцатая — 9·11 + 6 + 10 = 115, перенос 11
    Так что без вопросов, всё остаётся как было.

    Дальше как-то сможете своими силами?
    Ответ написан
    Комментировать
  • Как обеспечивается совместимость динамических библиотек при ликовке в рантайме?

    @Mercury13
    Программист на «си с крестами» и не только
    Устроено просто.
    1. Имена всё равно стараются не козявить. Те библиотеки, где объектный интерфейс выставлен наружу, менее любимы. А уж шаблонных специализаций вообще сторонятся.
    2. А если козявить — есть модель Windows (MSVC, Borland) и модель Linux (MinGW, CLang).
    3. В модели Linux подключение DLL устроено через файл *.a, смысл которого для DLL’ки — сопоставить покозявленное компилятором имя функции и таковое же, выставленное DLL’кой наружу. И для любой DLL’ки можно создать этот *.a с любыми именами. MSVC CL и MinGW LD могут подключать DLL и напрямую, CLang LLD — когда проверял, ещё нет.
    4. Да, а как заменить в скомпилированной программе. Обычно новую версию DLL’ки компилируют тем же компилятором — вот и вся совместимость. В x64 с этим делом проще, чем в x86 — меньше соглашений вызова.
    5. Часто в ABI приходится переименовывать функции из-за того, что сменилась сигнатура. То есть тащат и старую, и новую с разными именами.

    Когда программа собирается одним компилятором, а DLL’ка другим — это всегда большая сложность, и вопроса два: соглашения вызова и правило, по которым козявятся имена.
    Ответ написан
    Комментировать
  • Как найти расстояние от точки до вектора?

    @Mercury13
    Программист на «си с крестами» и не только
    Откуда начинается вектор?
    Если вектор AB и точка C, то расстояние — это ортогональная СОСТАВЛЯЮЩАЯ |AC×AB| / ||AC||·||AB||.
    a×b — это косое произведение векторов ax·by−ay·bx. В 2D это скаляр. Если убрать модуль в числителе, получится знаковое расстояние — плюс с одной стороны и минус с другой.
    ||a|| — длина вектора sqrt(ax²+ay²). Если есть функция hypot, используй её.
    Ответ написан
    Комментировать
  • Как зайти в bios роутера?

    @Mercury13
    Программист на «си с крестами» и не только
    Что такое BIOS? Это базовая система ввода-вывода.
    Какие функции выполняет BIOS на обычном ПК?
    1. Инициализация и проверка работоспособности матплаты — чтобы этим не занималась ОС с постороннего носителя.
    2. Начальная загрузка с постороннего носителя.
    3. Софт вроде Бейсика, доступный без носителя.
    4. Простейший API, позволяющий легче обращаться к консоли, дискам и прочему.
    5. Конфигурирование внешней аппаратуры.
    На встраиваемых системах нет во всём этом надобности, в отличие от расширяемого ПК.
    Разве что может быть конфигурирование аппаратуры — но для этого в некоторых микроконтроллерах (AVR) используют конфигурационные биты, они же «фьюзы». Ну а для конфигурирования внешнего по отношению к МК — только прошивка.
    А вот поковырять прошивку можно, если система позволяет. Как эту прошивку слить и залить — это отдельный вопрос.
    Ответ написан
    Комментировать
  • В какого типа переменных хранить адреса?

    @Mercury13
    Программист на «си с крестами» и не только
    Вариантов много.
    1. Непрозрачные указатели, которые нельзя разыменовывать.
    struct OpaqueAddress;
    using Address = OpaqueAddress*;

    2. void*, const void*.
    3. uintptr_t.
    4. Жёсткие int’ы, если работаем с конкретной посторонней прогой под конкретную архитектуру (например, пишем чит к игре).
    using Address = uint32_t;
    5. Enum class, основанный на соответствующем int’е.
    enum class Address : uintptr_t { NUL = 0 };
    Ответ написан
    Комментировать
  • Что стоит учить с или c++ или c#?

    @Mercury13
    Программист на «си с крестами» и не только
    Если ты умеешь программировать на чём угодно, хоть на Скрэтче — можно любой по желанию. Разберёшься.
    Если с нуля — только C#, на нём меньше шансов напортачить. Главная проблема Си, плохо решённая в Си++,— для простых вещей приходится работать со сложными концепциями вроде указателей для scanf.
    Ответ написан
    Комментировать
  • Есть ли реальная необходимость использовать Git LFS?

    @Mercury13
    Программист на «си с крестами» и не только
    У Git-LFS только два выигрыша.
    1. Перескок от ветки к ветке происходит быстрее.
    2. Многие хостинги имеют отдельную политику для крупных файлов, что позволяет как-то жить, не упираясь в пределы дискового места.
    Ответ написан
    Комментировать