Altifigence Academy

3 / 20 · Теория

Правила выхода с фиксированной точкой

Разделяйте масштаб входа, округление отрицательных чисел, насыщение и циклическое переполнение.

Биты хранят целое число; масштаб задаёт смысл

Представим x целым X и F дробными битами, так что x=X/2^F. Для A и B используется одинаковое F. Их произведение и аккумулятор имеют 2F дробных бит. Преобразование итоговой сырой суммы S обратно к масштабу входа требует деления на 2^F. Преобразуйте один раз после полной свёртки; округление каждого члена заранее может отбросить вклады, значимые при объединении.

При F=4 значения [1.5,−0.5] хранятся как [24,−8], а [0.25,2.0] — как [4,32]. Сырое скалярное произведение равно 24×4−8×32=−160. Его действительное значение — −160/256=−0.625, а выходное целое при F=4 равно −10.

Явно проверяйте округление отрицательных чисел

При S=−17 и F=4 точное выходное целое равно −1.0625. Арифметический сдвиг вправо даёт −2; усечение к нулю даёт −1. Округление к ближайшему с половинами к чётному также даёт −1. Следовательно, арифметический сдвиг не взаимозаменяем с любым толкованием «отбросить дробь». В половинных значениях −24/16=−1.5 и −40/16=−2.5 округление половин к чётному выбирает −2 в обоих случаях.

Наше преобразование по умолчанию округляет полную сумму к ближайшему с половинами к чётному, затем насыщает до выходной разрядности. Для абсолютной величины вычислите частное q и остаток r. Увеличивайте q, когда r превышает половину делителя либо равен половине и q нечётно. Затем восстановите исходный знак. В RTL модуль минимального отрицательного числа требует более широкой временной переменной; эталон Node использует BigInt.

Определите переполнение на выходе

Знаковый восьмибитный выход покрывает −128..127. Округлённое 130 насыщается до 127 или циклически переполняется до −126. Значение −130 насыщается до −128 или циклически переполняется до 126. Любое правило может быть намеренным, но его нужно назвать и проверить.

Сравнивайте сырой аккумулятор и преобразованный выход отдельно. Неверная сырая сумма указывает на арифметику или расписание; правильная сумма с неверным выходом — на масштаб, округление или насыщение. Сохраняйте рассчитанные вручную граничные случаи, чтобы эталон и RTL не могли вместе скрыть одну ошибку преобразования.

Попробуйте сами

Найдите результат округления половин к чётному при F=4, S=−56 и насыщенный восьмибитный выход при F=4, S=−2080.

Прочитать объяснение

−56/16=−3.5 округляется до чётного целого −4. −2080/16=−130 насыщается до −128 после округления.

Выбор действует в этом браузере. Его можно изменить внизу страницы.