Hacker News Digest

Тег: #ieee-754

Постов: 2

Float Exposed (float.exposed) 🔥 Горячее

  • half/bfloat/float/double – 4 формата: 16, 16-Trunc, 32, 64 бит
  • 0 – единственное число с экспонентой 0
  • 2⁵²–1 – максимум значащих бит у double
  • 1 – первое число после нуля
  • 30 – смещение экспоненты float (127–97)
  • (−1)²×2^(e–bias)×1.m – двоичная запись
  • ×2× – десятичная мантисса
  • Exact – точное десятичное значение
  • Δnext / Δprev – шаг к соседнему числу

by SomaticPirate • 12 сентября 2025 г. в 00:11 • 365 points

ОригиналHN

#ieee-754#floating-point#fp8#fp4#posits#rakulang#games#gaming

Комментарии (97)

  • Пользователи делятся лучшими визуальными объяснениями IEEE-754: ссылки на статьи Фабьена Санглара и Джулии Эванс.
  • Обсуждают «красивую» печать float: нужно 9 значащих цифр для однозначности, но тогда 0.1 → 0.100000001; существуют быстрые алгоритмы Dragon4, Grisu3, Ryu.
  • Интересный факт: сравнение float почти работает как сравнение signed-integer битов, если учесть знак и NaN.
  • Проблема удаления от начала координат в играх: дальше → хуже точность; Kerbal и Minecraft иллюстрируют «Far Lands».
  • Просят добавить fp8/fp4, жалуются на отсутствие денормалей, NaN, ∞ в визуализации.
  • Кто-то считает IEEE-754 «дьяволом», предпочитает posits или рациональные числа (Raku/FatRat).

Sometimes CPU cores are odd (anubis.techaro.lol)

Всё ПО содержит баги; чем сложнее код, тем запутаннее ошибки. Однажды я столкнулся с «однострочным» фиксом, который спас пользователей от случайных отказов Anubis.

Как всё началось
Anubis — WAF, который проверяет, что клиент — настоящий браузер. Основной способ — proof-of-work: клиент считает хэши, ограничивая скорость подключения. Чтобы экран-заглушка исчезал быстрее, JS-код использует максимум ядер CPU.

Проблема
Firefox тормозит, если задействовать все ядра; оптимум — половина. В коде было:

threads = Math.max(navigator.hardwareConcurrency / 2, 1)

Все мои тестовые устройства (MacBook, Ryzen, iPhone, Steam Deck…) имели чётное количество ядер, поэтому navigator.hardwareConcurrency / 2 всегда получался целым. Но если устройство с нечётным числом ядер (например, 3), результат — 1.5. JavaScript-числа — это IEEE-754, и дробная часть приводила к багу «invalid response», потому что логика расчёта nonce рассчитана на целые.

Фикс
Округлил до ближайшего целого:

threads = Math.max(Math.floor(navigator.hardwareConcurrency / 2), 1)

Одна строчка — и исчезли случайные отказы на нечётных CPU.

by rbanffy • 28 августа 2025 г. в 21:39 • 98 points

ОригиналHN

#javascript#web-application-firewall#proof-of-work#web-performance#browser-detection#cpu-cores#ieee-754

Комментарии (109)

  • Разработчики Anubis не учли, что бывают процессоры с нечётным числом ядер (3, 9 и т.д.), из-за чего проверка «кол-во ядер = степень двойки» ломается.
  • Пользователи жалуются: на телефонах с 9 ядрами (S24+) тест висит и жрёт батарею, а без JS сайты работают быстрее.
  • Часть комментаторов считает PoW-валидацию бесполезной: боты всё равно запускают JS, а легитимные пользователи платят тем же временем/энергией.
  • Предлагают отказаться от PoW в пользу «Proof of React» или просто убрать жёсткую привязку к числу ядер.
  • Некоторые отключают JS и cookies по умолчанию и обходят Anubis, но всё чаще просто уходят с сайтов.