А вот, значитца, code golf
Jun. 6th, 2026 12:34 amВместо эпиграфа: — Феофания, у нас проблема!
Имеем следующее: Банальное исполнение целого деления через плавающую точку, как это реализовано в Паскале, закономерно приводит к floor(a/b):
Для честной реализации современного Си нужно деление, которое делает округление в сторону нуля - это неизбежно вытекает из того, что современный Си стандартизирует операцию % как remainder (знак результата соответствует знаку делимого). Можно, конечно, наплевать и сказать, что раз это стандартизовали только в С99, то насильно делать это в БЭСМовском Си было бы анахронично, но всё равно интересно, сколько команд потребует реализация целого деления "правильно". Для простоты примем, что время выполнения нам непринципиально.
Что удобно, реализация остатка не нуждается в изменении: он в любом случае считается как a - a/b*b.
Необходимое примечание: команда avx с неотрицательным операндом только нормализует, с отрицательным - нормализует и обращает знак. Это удобно и выгодно, поскольку обращение знака от MIN_INT одновременно снормализацией работает как надо. Нормализованность операнда роли не играет, команда смотрит только на знак.
Имеем следующее: Банальное исполнение целого деления через плавающую точку, как это реализовано в Паскале, закономерно приводит к floor(a/b):
, ntr , . включили нормализацию
, avx , . нормализовали
15 , stx , 1 . сумматор (делитель) - в пустое место выше стека,
. делимое - из стека на сумматор
, avx , . нормализовали
15 , a/x , 2 . поделили (указатель стека декрементирован командой stx, поэтому 2)
, ntr , 3 . выключили нормализацию
1 , a+x , 11b . прибавили 0 с целым порядком, лежащий по известному смещению по регистру 1
. это выдвигает дробную часть из сумматора
Для честной реализации современного Си нужно деление, которое делает округление в сторону нуля - это неизбежно вытекает из того, что современный Си стандартизирует операцию % как remainder (знак результата соответствует знаку делимого). Можно, конечно, наплевать и сказать, что раз это стандартизовали только в С99, то насильно делать это в БЭСМовском Си было бы анахронично, но всё равно интересно, сколько команд потребует реализация целого деления "правильно". Для простоты примем, что время выполнения нам непринципиально.
Что удобно, реализация остатка не нуждается в изменении: он в любом случае считается как a - a/b*b.
Необходимое примечание: команда avx с неотрицательным операндом только нормализует, с отрицательным - нормализует и обращает знак. Это удобно и выгодно, поскольку обращение знака от MIN_INT одновременно снормализацией работает как надо. Нормализованность операнда роли не играет, команда смотрит только на знак.