diff --git a/apps/website/src/data/blog/bodies/physical-width-changed-the-question.ts b/apps/website/src/data/blog/bodies/physical-width-changed-the-question.ts new file mode 100644 index 0000000000..9443b10819 --- /dev/null +++ b/apps/website/src/data/blog/bodies/physical-width-changed-the-question.ts @@ -0,0 +1,47 @@ +import type { Block } from '../types' + +export const body: Block[] = [ + { kind: 'p', text: '[measured — committed oracle, not board hardware] W991 reran the competitor table from the repository’s committed oracles. The useful correction came before any comparison: TNF16 labelled as 16 bits had 516,096 values, which is more than 2^16. Four exponent trits occupy seven binary storage bits, so that ladder rung is physically 19 bits.' }, + { kind: 'h', text: 'The table now asks the physical question' }, + { kind: 'p', text: 'The repair keys the comparison by physical width and refuses a width that no rung occupies. This separates a nominal label from the container that actually holds the sign, exponent field, and mantissa. It is a bookkeeping correction with a measurable consequence: the old query could compare unlike containers while looking precise.' }, + { kind: 'table', head: ['physical width', 'TNF rung', 'TNF values', 'posit es=1 values', 'TNF step at 1.0', 'posit step at 1.0'], rows: [ + ['6 bits', 'TNF4 (2 trits, 1 mantissa bit)', '56', '62', '25%', '12.5%'], + ['10 bits', 'TNF8 (3 trits, 4 mantissa bits)', '960', '1022', '3.125%', '0.781%'], + ['19 bits', 'TNF16 (4 trits, 11 mantissa bits)', '516,096', '524,286', '0.024%', '0.002%'] + ] }, + { kind: 'p', text: 'At every matched width in this ladder, TNF has fewer reachable values and a coarser local step at 1.0 than posit with es=1. The gap is structural: four trits use 81 of the 128 codes available in their seven-bit binary field, leaving 8,190 codes unreachable. This is a statement about the representation lattice, not an accuracy score and not a hardware-cost result.' }, + { kind: 'h', text: 'The comparison is not the conclusion' }, + { kind: 'quote', text: 'A table can be internally exact and still answer the wrong width question.' }, + { kind: 'p', text: 'The corrected table does not establish that one format is preferable for a workload. It does not measure LUTs, timing, energy, downstream model quality, or a board run. The repository records those as separate questions; W991 only makes the width and lattice comparison auditable.' }, + { kind: 'h', text: 'What the patch leaves open' }, + { kind: 'ul', items: [ + 'Whether the physical-width comparison changes a workload-level choice is not measured.', + 'The table does not provide a cost model; area, timing, and energy remain separate measurements.', + 'The displayed local step describes the neighbourhood of 1.0 and is not a summary of every extreme of a tapered format.', + 'The TNF ladder and the posit oracle are compared at matched container widths; no claim about takum accuracy is made here.' + ] }, + { kind: 'p', text: 'The practical lesson is small and reusable: before comparing numeric formats, derive the stored width from the encoding and make the tool reject impossible widths. The correction is merged in gHashTag/trinity-fpga PR #727; the committed JSON is the receipt.' } +] + +export const ruBody: Block[] = [ + { kind: 'p', text: '[измерено — зафиксированный оракул, не плата] В работе W991 таблица конкурирующих форматов была пересчитана по зафиксированным в репозитории оракулам. Полезная поправка появилась до сравнения: TNF16, помеченный как 16-битный, выдавал 516 096 значений — это больше 2^16. Четыре трита экспоненты занимают семь двоичных ячеек, поэтому эта ступень физически имеет 19 бит.' }, + { kind: 'h', text: 'Таблица теперь задаёт физический вопрос' }, + { kind: 'p', text: 'После исправления сравнение индексируется физической шириной и отказывается от ширины, которой нет ни на одной ступени. Это отделяет номинальную этикетку от контейнера, где действительно лежат знак, поле экспоненты и мантисса. Поправка выглядит бухгалтерской, но её след измерим: прежний запрос мог сопоставить разные контейнеры, сохраняя вид точного расчёта.' }, + { kind: 'table', head: ['физическая ширина', 'ступень TNF', 'значения TNF', 'значения posit es=1', 'шаг TNF при 1.0', 'шаг posit при 1.0'], rows: [ + ['6 бит', 'TNF4 (2 трита, 1 бит мантиссы)', '56', '62', '25%', '12.5%'], + ['10 бит', 'TNF8 (3 трита, 4 бита мантиссы)', '960', '1022', '3.125%', '0.781%'], + ['19 бит', 'TNF16 (4 трита, 11 бит мантиссы)', '516 096', '524 286', '0.024%', '0.002%'] + ] }, + { kind: 'p', text: 'На каждой сопоставленной ширине этой лестницы у TNF меньше достижимых значений и крупнее локальный шаг около 1.0, чем у posit с es=1. Причина структурная: четыре трита используют 81 из 128 кодов семибитового двоичного поля, поэтому 8 190 кодов недостижимы. Это утверждение о решётке представления, а не об оценке точности и не о стоимости железа.' }, + { kind: 'h', text: 'Сравнение не является выводом о выборе' }, + { kind: 'quote', text: 'Таблица может быть внутренне точной и всё равно задавать неправильный вопрос о ширине.' }, + { kind: 'p', text: 'Исправленная таблица не устанавливает, что один формат предпочтительнее для какой-либо нагрузки. Она не измеряет LUT, тайминг, энергию, качество модели после квантования или прогон на плате. В репозитории это отдельные вопросы; W991 делает проверяемыми только ширину и решётку значений.' }, + { kind: 'h', text: 'Что поправка оставляет открытым' }, + { kind: 'ul', items: [ + 'Изменит ли физическое сопоставление ширин выбор для реальной нагрузки — не измерено.', + 'Таблица не является моделью стоимости: площадь, тайминг и энергия требуют отдельных замеров.', + 'Показанный локальный шаг описывает окрестность 1.0 и не суммирует все крайние зоны tapered-формата.', + 'Лестница TNF и оракул posit сопоставлены по ширине контейнера; утверждения о точности takum здесь нет.' + ] }, + { kind: 'p', text: 'Практический урок небольшой и переносимый: перед сравнением числовых форматов вывести хранимую ширину из кодировки и заставить инструмент отвергать невозможные ширины. Поправка смержена в PR #727 репозитория gHashTag/trinity-fpga; зафиксированный JSON — проверяемый receipt.' } +] diff --git a/apps/website/src/data/blog/index.ts b/apps/website/src/data/blog/index.ts index 6cd92193f3..1cc515391c 100644 --- a/apps/website/src/data/blog/index.ts +++ b/apps/website/src/data/blog/index.ts @@ -2,6 +2,36 @@ import type { PostMeta } from './types' /** Индекс блога: список и метаданные без тяжёлых тел публикаций. */ export const postsIndex: PostMeta[] = [ + { + slug: 'physical-width-changed-the-question', + title: 'Physical width changed the question', + summary: 'A committed-oracle comparison exposed a nominal-width error: TNF16 labelled as 16 bits occupies 19 physical bits, so the table now matches containers before comparing lattices.', + date: '2026-08-23', + readingMinutes: 7, + tags: ['Number formats', 'Conformance', 'Measurement', 'Self-critique'], + receipts: [ + { label: 'gHashTag/trinity-fpga PR #727 — W991/W992 merged', href: 'https://github.com/gHashTag/trinity-fpga/pull/727' }, + { label: 'W991 committed measurement table', href: 'https://github.com/gHashTag/trinity-fpga/blob/main/research/arxiv_tnf/measurements/compare_w991.json' }, + { label: 'Merge commit 78987a4', href: 'https://github.com/gHashTag/trinity-fpga/commit/78987a4e0757de47b4ab6e9a2a9d486180e688f4' }, + ], + openQuestions: [ + 'Whether matching physical width changes a workload-level choice is not measured. W991 compares the representation lattice only.', + 'No LUT, timing, energy, or board measurement follows from this table. Those are separate artifacts and remain open.', + 'The local step at 1.0 does not summarize the extreme behaviour of a tapered format, so it must not be read as a whole-range accuracy claim.', + 'The comparison is with posit for the committed lattice table; no accuracy comparison with takum is made here, and no claim about a preferred format is supported.' + ], + published: true, + ru: { + title: 'Физическая ширина изменила вопрос', + summary: 'Сравнение по зафиксированным оракулам обнаружило ошибку номинальной ширины: TNF16, помеченный как 16-битный, занимает 19 физических бит, поэтому сначала сопоставляются контейнеры, а потом решётки значений.', + openQuestions: [ + 'Изменит ли сопоставление по физической ширине выбор для реальной нагрузки — не измерено. W991 сравнивает только решётку представления.', + 'Из этой таблицы не следуют замеры LUT, тайминга, энергии или платы. Это отдельные артефакты, и вопрос остаётся открытым.', + 'Локальный шаг при 1.0 не описывает крайние зоны tapered-формата, поэтому его нельзя читать как утверждение о точности на всём диапазоне.', + 'В таблице решётка сопоставлена с posit; сравнение точности с takum здесь не проводится, и предпочтительный формат не выбирается.' + ] + } + }, { slug: 'nobodys-example', title: "Nobody's example", diff --git a/apps/website/src/data/blog/posts.ts b/apps/website/src/data/blog/posts.ts index 421b150e3e..f2a6d3e017 100644 --- a/apps/website/src/data/blog/posts.ts +++ b/apps/website/src/data/blog/posts.ts @@ -1,6 +1,7 @@ import { postsIndex } from './index' import { body as body_a_health_snapshot_changed_its_denominator, ruBody as ruBody_a_health_snapshot_changed_its_denominator } from './bodies/a-health-snapshot-changed-its-denominator' import type { Post, PostBody } from './types' +import { body as body_physical_width_changed_the_question, ruBody as ruBody_physical_width_changed_the_question } from './bodies/physical-width-changed-the-question' import { body as body_nobodys_example, ruBody as ruBody_nobodys_example } from './bodies/nobodys-example' import { body as body_the_silence_was_a_saturated_readout, ruBody as ruBody_the_silence_was_a_saturated_readout } from './bodies/the-silence-was-a-saturated-readout' import { body as body_twenty_merged_in_three_days, ruBody as ruBody_twenty_merged_in_three_days } from './bodies/twenty-merged-in-three-days' @@ -55,6 +56,7 @@ import { body as body_the_scanner_scored_what_it_could_not_see, ruBody as ruBody import { body as body_i_wrote_the_post_then_did_the_thing, ruBody as ruBody_i_wrote_the_post_then_did_the_thing } from './bodies/i-wrote-the-post-then-did-the-thing' const bodies: Record = { + 'physical-width-changed-the-question': { body: body_physical_width_changed_the_question, ruBody: ruBody_physical_width_changed_the_question }, 'nobodys-example': { body: body_nobodys_example, ruBody: ruBody_nobodys_example }, 'the-silence-was-a-saturated-readout': { body: body_the_silence_was_a_saturated_readout, ruBody: ruBody_the_silence_was_a_saturated_readout }, 'twenty-merged-in-three-days': { body: body_twenty_merged_in_three_days, ruBody: ruBody_twenty_merged_in_three_days },