Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Округление в меньшую сторону

Delphi , Синтаксис , Математика



Автор: Dimka Maslov
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> «Округление» в меньшую сторону

Функция возвращает наибольшее число,
меньшее или равное Value, которое
без остатка делится на Divider

Зависимости: нет
Автор:       Dimka Maslov, mainbox@endimus.ru, ICQ:148442121, Санкт-Петербург
Copyright:   Dimka Maslov
Дата:        20 мая 2002 г.
***************************************************** }

function RoundPrev(Value, Divider: Integer): Integer;
asm
   mov ecx, edx
   cdq
   idiv ecx
   imul ecx
end;

Пример использования:

RoundPrev(10, 3) // = 9
RoundPrev(9, 3) // = 9

Программная функция для округления вниз до ближайшего кратного заданному делителю!

Код структурирован и легко понятен. Вот разбивка:

Подпись функции

function RoundPrev(Value, Divider: Integer): Integer;

Функция принимает два целочисленных параметра: Value и Divider. Она возвращает целочисленный результат.

Ассемблерный код

mov ecx, edx
cdq
idiv ecx
imul ecx
end;

Это сердце функции. Ассемблерный код довольно изобретательен: 1. mov ecx, edx: Копирует значение Divider в регистр ECX. 2. cdq: Устанавливает флаг знака (CF) и конвертирует Value в подписанный 32-битный целочисленный тип (т.е., расширяет до 32 бит). 3. idiv ecx: Делит Value на Divider с помощью подписанной деления, хранит результат в регистре EDX. 4. imul ecx: Умножает кратное из шага 3 на Divider, эффективно округляя вниз.

Пример использования

RoundPrev(10, 3)  // = 9
RoundPrev(9, 3)  // = 9

Эти примеры демонстрируют, как функция работает. Например, при вызове RoundPrev(10, 3) функция делит 10 на 3 и получает кратное 3 с остатком 1. Инструкция imul затем умножает это кратное на 3, эффективно округляя вниз до 9.

Альтернативное решение Если вы хотите реализовать эту функциональность без использования ассемблерного кода, можно использовать функцию Trunc из модуля Math:

function RoundPrev(Value, Divider: Integer): Integer;
begin
  Result := Trunc(Value / Divider) * Divider;
end;

Эта реализация более проста и легче поддерживаемая. Функция Trunc выполняет подписанное деление и возвращает целочисленный результат, который затем умножается на Divider, чтобы достичь эффекта округления вниз.

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

Округление в меньшую сторону - функция, которая возвращает наибольшее число, меньше или равное Value, которое без остатка делится на Divider.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: Математика ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-15 23:32:47/0.0034511089324951/0