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

Округление до ближайшего кратного

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

Округление до ближайшего кратного

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

{ **** UBPFD *********** by delphibase.endimus.com ****
>> «Округление» до ближайшего кратного

Функция возвращает ближайшее к Value число, которoе без
остатка делится на N. Если Value находится посередине
между двумя кратными, функция вернёт большее значение.

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

function RoundTo(Value, N: Integer): Integer;
asm
   push ebx
   mov ebx, eax
   mov ecx, edx
   cdq
   idiv ecx
   imul ecx

   add ecx, eax
   mov edx, ebx
   sub ebx, eax
   jg @@10
   neg ebx
@@10:
   sub edx, ecx
   jg @@20
   neg edx
@@20:
   cmp ebx, edx
   jl @@30
   mov eax, ecx
@@30:
   pop ebx
end;

Вот перевод текста на русский язык:

Это реализация функции на языке ассемблера, которая округляет заданное значение до ближайшего кратного указанному числу. Функция принимает два параметра: Value (целое число) и N (целое число), которое представляет собой желаемое кратное.

Вот шаг за шагом, что код делает:

  1. Он сначала кладет на стек значение ebx, перемещает в ebx значение параметра eax (Value) и перемещает в ecx значение параметра edx (N).
  2. Затем он выполняет целочисленное деление (idiv ecx) значения в ebx по значению в ecx. Это эффективно вычисляет частное от деления Value на N.
  3. Он умножает результат деления на N с помощью инструкции imul ecx.
  4. Код затем добавляет к результату умножения оригинальное значение eax, что перемещает Value к ближайшему кратному N. Это делается с помощью инструкции add ecx, eax.
  5. Затем он вычитает из ebx (который теперь содержит округленное значение) оригинальное значение eax и прыгает на метку, если результат больше 0. Это обеспечивает, что если Value было ровно между двумя кратными N, функция округлит вверх вместо вниз.
  6. Если результат вычитания не больше 0, он отрицает значение в ebx (т.е. делает его отрицательным) для обеспечения, что округленное значение меньше или равно оригинальному значению.
  7. Код затем вычисляет остаток от деления Value на N с помощью инструкции sub edx, ecx и прыгает на метку, если результат больше 0. Это обеспечивает, что округленное значение не более чем на единицу удалено от ближайшего кратного N.
  8. Если результат вычитания не больше 0, он отрицает значение в edx (т.е. делает его отрицательным) для обеспечения, что остаток меньше или равно оригинальному значению.
  9. Наконец, код сравнивает значения в ebx и edx с помощью прыжка, если результат сравнения меньше 0. Если это условие истинно, функция возвращает округленное значение в ecx.

В терминах альтернативного решения, вы можете реализовать эту функциональность с использованием более высокого уровня программирования, такого как Pascal или C++. Вот возможная реализация на Pascal:

function RoundTo(Value: Integer; N: Integer): Integer;
begin
  Result := (Value + N - 1) div N * N;
end;

Эта функция использует оператор модуля (div) для вычисления частного от деления Value на N, добавляет N-1 к результату, а затем умножает результат на N для округления до ближайшего кратного. Этот подход проще и более читаемый, чем реализация на языке ассемблера.

Округление до ближайшего кратного - функция возвращает ближайшее целое число, кратное заданному N, которое без остатка делится на N.


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

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




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


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


реклама


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

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 12:08:41/0.0039350986480713/0