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 после округления.