Блог
Формат, у которого φ в названии. Измерено: в двухбитном алфавите цифр φ вообще не наблюдаем, а скалярное произведение векторов GFTernary точно равно φ² на те же коды, прочитанные как сбалансированная троичная. Предшествующая работа поставила φ туда, где он несёт информацию, ещё в 2002-м.
У формата под названием GoldenFloat золотое сечение стоит в имени. Спрашивать стоит не о том, близко ли 1.618 к φ, а о том, выполняется ли определяющее свойство φ в той арифметике, которой формат реально считает.
Здесь φ живёт в трёх арифметиках, и они не согласны между собой.
| где | φ² = φ + 1 ? | примечание |
|---|---|---|
| оракул, точное кольцо ℤ[φ] | да, символьно | 14641/14641 решений о знаке сходятся с 60-значной арифметикой, ни разу не касаясь float |
| замкнутый 2-битный формат | не измеримо | см. ниже |
| RTL, fp32 | нет, расхождение 1 ulp | 0x40278DDF против 0x40278DDE |
Декодировать два кода, выполнить операцию, квантовать обратно по знаку. Подстановка 1, 2, π, 0.001 или 10¹² вместо φ даёт идентичные 16 таблиц сложения и 16 умножения. На двух битах формат наблюдательно неотличим от сбалансированной троичной.
В скалярном произведении тот же факт принимает более резкую форму. Каждая цифра есть φ·t, где t ∈ {−1, 0, +1}, поэтому каждое слагаемое равно (φ·t)(φ·u) = φ²·t·u, и по линейности:
<x, y> = φ² · <x~, y~>
где x~ и y~ — те же коды, прочитанные как сбалансированная троичная. Проверено на 20000 случайных скалярных произведений как целочисленное равенство в ℤ[φ]: аккумулятор всегда равен (k, k). Первая попытка мерила это через десятичное приближение φ, дала 1e-47, и я чуть не записал результат как точный ноль. Ошибкой была линейка, а не результат.
φ² = 2.618034 — константа, которую любой квантованный конвейер уже несёт как per-tensor scale. Реализующая её константа fp32 `0x3FCF1BBD` — корректно округлённый φ (0.138 ulp), и она не добавляет представимости, но стоит округления: 14 ulp на скалярном произведении длины 4096, и φ² ≠ φ + 1 в железе с расхождением в 1 ulp.
Плата за это — площадь. Произведение двух 2-битных кодов вычисляется так: оба декодируются в fp32, запускается полноразмерный умножитель формы IEEE, и 32-битный результат порогами сводится обратно к двум битам.
| блок | ячеек | проводов | триггеров |
|---|---|---|---|
| gf_mul_param, свободные 32-битные входы | 1654 | 1664 | 17 |
| точный блок, без умножителя и без φ | 13 | 14 | 0 |
| fp32-путь с 2-битными входами | 14 | 63 | 2 |
Измерено на Yosys 0.65. Версия — часть числа: тот же скрипт на 0.33 даёт другие счётчики ячеек. Все 16 пар входов совпадают между двумя блоками, прогнанные через рукопожатие fp32-конвейера: это эквивалентность, а не просто уменьшение.
Третья строка — не проект. Это yosys приходит к тому же выводу распространением констант: когда входов всего четыре кода, умножитель сворачивается. Такое сворачивание — везение, а не архитектура. Проект по-прежнему запрашивает общий умножитель ради функции от четырёх бит, и инструмент, который не свернёт, заплатит первую строку.
Ничто из этого не говорит, что φ — плохой выбор. Оно говорит, что алфавит цифр — то самое место, где φ не может сделать никакой работы. Поставьте его в позиционные веса, и он сможет: тернарная зеркально-симметричная система Стахова использует цифры {−1, 0, +1} с весами φ^(2i), опираясь на систему Бергмана с основанием φ (1957). Там позиция цифры меняет её значение, поэтому φ не выносится.
Эта система была здесь переписана и проверена: у каждого целого от 0 до 12 есть представление, чья строка цифр не меняется при чтении задом наперёд. Именно на этом свойстве Стахов построил самопроверяющийся сумматор: сбой ломает симметрию, и код обнаруживает собственную ошибку.
Та же константа, противоположный итог. Предшествующая работа выбрала несущее место ещё в 2002-м.
Верификатор, стоящий за всем этим, прошёл мутационное тестирование — и пережил мутацию, которую обязан был поймать: подмена одной записи в таблице оставила все утверждения зелёными, потому что таблица стояла по обе стороны проверяемого тождества и сократилась сама с собой. Часом раньше шаг воркфлоу, написанный чтобы поймать молча игнорируемый пин тулчейна, читал 8-значную дату из строки версии, где даты нет, — охрана пропускала сравнение, и шаг рапортовал успех, ничего не сравнив.
Оба были вакуумными. Ни один не был найден чтением; оба нашлись, когда меняешь константу и замечаешь, что ничего не покраснело. Из этого выросла команда, и наведённая обратно на верификатор она нашла третью дыру: тест подстановки сравнивал таблицы квантователя только друг с другом, поэтому вырожденный квантователь сделал бы всё утверждение об инертности вакуумно истинным. Теперь таблица привязана к декодеру RTL.
Проверка, которая не может провалиться, неотличима от проверки, которая прошла.
Ни частоты, ни платы, ни энергопотребления. Точный блок комбинационный, поэтому ноль триггеров — свойство блока, а не заявка на скорость. Ничто здесь не сверяет проект со спецификацией. И измерение, которое решает, стоит ли вообще публиковать это семейство форматов — блочная ось против MXFP4 — не сделано.
Каждая цифра выше измерена, и рядом с ней названы её пределы.