Re: Go заменяет С++ ?
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 19.05.25 13:07
Оценка:
Здравствуйте, merge, Вы писали:

M>Смотрю иногда пишут "знание С++ и желание выучить Go и на нем писать в дальнейшем".

M>Область плюсов сужается или идет замена в принципе и нет областей где плюсы выглядели бы незаменимы?

Кстати, плюсовый userver в этом плане как раз является ответом гошечке, фреймворк делался с оглядкой на него в том числе. По вакансиям видно, что в Яндексе используется и userver, и Go. Значит, ни у одного из них нет явного преимущества в этих задачах.
Re[5]: Go заменяет С++ ?
От: undo75  
Дата: 19.05.25 16:37
Оценка:
M>Нафиг писать годами на асме то, что можно написать за недели на плюсах, и ещё и спортировать или даже просто взять код с больших систем?

незачем. тем более скорее всего компилятор куда лучше преуспеет с оптимизацией.
вопрос в другом — нужна ли экзотика типа го ) имхо поболит и отвалится. а классика никуда не денется. чисто мое имхо.
Re[6]: Go заменяет С++ ?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 19.05.25 22:55
Оценка: +1
Здравствуйте, Философ, Вы писали:

Ф>Фиксированную точку вроде через BCD реализуют (реализовывали). Это вроде бы наиболее корректный и производительный путь.


Что за ерунда? Самый простой путь — берёшь uint32_t, и говоришь, что точка посередине, т.е. число с фикс точкой формата 16b.16b.

Сложение/вычитание — просто складываешь/вычитаешь, ничего больше делать не нужно (ну, только следить за переполнением, но это тоже элементарно).

Умножение — расширяешь множители до uint64_t, умножаешь, результат сдвигаешь на 16 бит вправо, усекаешь до uint32_t — всё, готово.

Деление — аналогично умножению, только сдвигать надо влево (или не нужно, сейчас что-то лень думать).

Куда уж проще и быстрее
Маньяк Робокряк колесит по городу
Re[7]: Go заменяет С++ ?
От: Философ Ад http://vk.com/id10256428
Дата: 20.05.25 01:57
Оценка:
Здравствуйте, Marty, Вы писали:

M>Что за ерунда? Самый простой путь — берёшь uint32_t, и говоришь, что точка посередине, т.е. число с фикс точкой формата 16b.16b.


Да, ты прав — я тут посовещался с qwen'ом на эту тему. BCD действительно сильно медленее. Квэн говорит, что именно твой подход использовался в игровых движках.
Однако, похоже, всё определяют цели. Я всякие чаты вот таким вопросом мучал:

Действительно ли ручная реализация fixed-point арифметики может привести к потере точности. Приведи примеры, где ручная реализация fixed-point приведёт к потере точности, а использование BCD — нет.

  здесь часть ответа
Когда лучше использовать BCD

  • Бухгалтерские программы
  • Кассовые аппараты
  • Системы учёта налогов
  • Встроенные терминалы

📌 BCD позволяет точно представлять такие числа, как `0.1`, `0.01`, `0.001` и т.д., без ошибок округления.

---

  • Когда выгоднее использовать Fixed-Point

    • Игровые движки (до FPU)
    • Графические системы
    • Аудио/видео кодирование
    • Микроконтроллеры
    • Быстрые математические библиотеки

    📌 Fixed-point эффективен по скорости и памяти, но требует аккуратности при умножении и делении.

    ---

  • Как избежать потери точности в fixed-point?

    • Используйте большие типы (`int64_t`) для промежуточных вычислений
    • Добавляйте округление перед сдвигами:
      int32_t result = (temp + (1 << 15)) >> 16; // +0.5 перед сдвигом

    • Избегайте деления, используйте предвычисленные значения
    • Храните деньги в целых копейках, а не в долях

    ---

  • Итог

    ЗадачаFixed-PointBCD
    Финансовые расчёты⚠️ Может давать ошибки✅ Точные
    Графика/физика✅ Отлично подходит❌ Неэффективно
    Вывод на экран⚠️ Нужны преобразования✅ Легко выводить
    Вычисления✅ Быстро, но с ошибками✅ Точно, но медленно
    📌 Fixed-Point — это компромисс между скоростью и точностью.
    📌 BCD — это выбор, когда точность важнее производительности.

    ---

  • Дополнительно: BCD vs Fixed-Point в ассемблере

    ОперацияFixed-Point (16.16)BCD
    Сложение
    add eax, ebx
    add al, bl
    daa
    Умножение
    mov edx, eax
    imul edx, ebx
    shr edx, 16
    mov eax, edx
    Ручная реализация, занимает много тактов
    Деление
    shl eax, 16
    idiv ebx
    shl eax, 16
    div ebx
    ---

  • Вывод

    • Fixed-point арифметика может привести к потере точности, особенно при работе с числами, которые не представимы точно в двоичном виде
    • BCD обеспечивает абсолютную десятичную точность, но менее эффективен по памяти и скорости
    • Для финансовых систем: либо BCD, либо fixed-point, работающий только с копейками (целые числа)
    • Для высокопроизводительных вычислений: fixed-point или float/double/SIMD
  • Всё сказанное выше — личное мнение, если не указано обратное.
    Re[8]: Go заменяет С++ ?
    От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
    Дата: 20.05.25 02:32
    Оценка: 4 (1)
    Здравствуйте, Философ, Вы писали:

    M>>Что за ерунда? Самый простой путь — берёшь uint32_t, и говоришь, что точка посередине, т.е. число с фикс точкой формата 16b.16b.


    Ф>Да, ты прав — я тут посовещался с qwen'ом на эту тему. BCD действительно сильно медленее. Квэн говорит, что именно твой подход использовался в игровых движках.

    Ф>Однако, похоже, всё определяют цели.

    Да ты мыслитель


    Ф>Я всякие чаты вот таким вопросом мучал:

    Ф>

    Действительно ли ручная реализация fixed-point арифметики может привести к потере точности. Приведи примеры, где ручная реализация fixed-point приведёт к потере точности, а использование BCD — нет.


    Ф>
    Когда лучше использовать BCD

    Ф>

    Ф>📌 BCD позволяет точно представлять такие числа, как `0.1`, `0.01`, `0.001` и т.д., без ошибок округления.


    Да, фиксед поинт не позволяет точно хранить десятичные числа с дробной частью. Собственно, как и floating point числа — там мантисса и экспонента всё равно по основанию 2, но десятичные числа для бухгалтерии можно хранить не в целых рублях и дробных копейках, а в целых копейках или даже в долях копеек, и тогда ничего не потеряется.

    Или, если очень нужно точное представление дробных десятичных чисел, можно использовать что-то типа marty::Decimal (если что, точка там плавает). Точность у меня может теряться только при делении (по умолчанию для деления используется точность 18 знаков после точки).

    А если нужны целые большой размерности, то можно глянуть в буст, или посмотреть на marty::BigInt — целые числа произвольного размера.
    Маньяк Робокряк колесит по городу
    Re[9]: Go заменяет С++ ?
    От: Философ Ад http://vk.com/id10256428
    Дата: 20.05.25 05:47
    Оценка:
    Здравствуйте, Marty, Вы писали:

    M>Да ты мыслитель


    Не смейся — я впервые в эту тему полез. Про BCD знал из книжки Юрова "Ассемблер". Я по этой книжке асм учил, когда у меня ещё компа не было. Не надо было до этого момента.
    Вот и посидел ночью с квеном пообщался. Разметку текста для цитаты, кстати, тоже он делал.
    Всё сказанное выше — личное мнение, если не указано обратное.
    Re[10]: Go заменяет С++ ?
    От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
    Дата: 20.05.25 11:39
    Оценка: :)
    Здравствуйте, Философ, Вы писали:

    M>>Да ты мыслитель


    Ф>Не смейся — я впервые в эту тему полез.


    Но вполне уверенно ворвался в тему
    Маньяк Робокряк колесит по городу
    Re[6]: Go заменяет С++ ?
    От: Pzz Россия https://github.com/alexpevzner
    Дата: 20.05.25 11:47
    Оценка:
    Здравствуйте, Marty, Вы писали:

    Pzz>>Докеры всякие умеют грузить всякие запчасти по HTTP/HTTPS.


    M>Эти дрова скорее всего в юзерспейсе пасутся, такая "системщина" ничем особым от обычных приложух не отличается


    Мне не близка идея считать системным ПО, которое в именно вот в кернелспейсе.

    А как быть с микроядрами? Там примерно всё в юзерспейсе.
    Re[6]: Go заменяет С++ ?
    От: Pzz Россия https://github.com/alexpevzner
    Дата: 20.05.25 11:52
    Оценка:
    Здравствуйте, Философ, Вы писали:

    Ф>Я вообще не знаю ни одного языка общего назначения, который бы BCD знал и юзал. Неофиты даже не знают, что такое существует.


    PL/1, наверное.
    Re[9]: Go заменяет С++ ?
    От: undo75  
    Дата: 20.05.25 12:08
    Оценка:
    Ф>Например бэкап — оч. характерный пример IO-bound задачи с высокой степенью параллелилизма. Когда-то я таким занимался.
    зачем в бэкапе параллелизм? наоборот же процесс тормозиться будет. ио-устройство ведь одно? или не одно? ну тогда да

    Ф>Ещё примеры:

    Ф>Поиск по дискам — просто множество IO-операций.
    Ф>Инсталляция, апдейт, например — пакетные менеджеры очень много контрольных сумм считают, вычисления минимальны.
    Ф>Системы мониторинга, например — сбор метрик с множества источников, агрегация данных телеметрии, парсинг и индексация логов, поиск по логам
    Ф>Работа с периферийными устройствами, например — обработка данных с датчиков
    Ф>Облака, например — синхронизация данных между локальным диском и облачным хранилищем

    ты считаешь высокоуровневый язык с этим лучше справится?
    Re[10]: Go заменяет С++ ?
    От: Nuzhny Россия https://github.com/Nuzhny007
    Дата: 20.05.25 12:44
    Оценка:
    Здравствуйте, undo75, Вы писали:

    U>зачем в бэкапе параллелизм? наоборот же процесс тормозиться будет. ио-устройство ведь одно? или не одно? ну тогда да


    Это сильно зависит от диска (HDD/SSD), бэкап по сети, на один или несколько источников и т.д. и т.п. Он может быть инкрементальгый, например, или надо что-то заархивировать.

    U>ты считаешь высокоуровневый язык с этим лучше справится?


    Я слышал, что тот же Zabbix с С на Го переписывают.
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.