![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Несоответствие результатов операции модуля в Free Pascal и ожидаемом поведенииDelphi , Компоненты и Классы , Процедуры и функцииОператор модуля (mod) в Free Pascal может давать результаты, которые отличаются от ожидаемых. Это можно продемонстрировать с помощью программы на Free Pascal, которая выдает результат, не совпадающий с тем же расчетом в Python или Google. Пример программы на Free Pascal:
Вывод программы: Теперь сравните это с выводом скрипта на Python:
Вывод: Этот результат совпадает с результатом, полученным при введении следующего текста в Google или при использовании оператора mod в VAX-Pascal:
Почему Free Pascal работает по-другому?Для неотрицательного целого дивиденда и положительного целого делителя нет неоднозначности. Все языки программирования работают одинаково. Однако, если использовать другие значения, языки программирования могут различаться. В Паскале используется определение оператора модуля, похожее на определение из евклидовой геометрии. В ISO стандарте 7185 ("Standard Pascal"), страница 48, это определено следующим образом:
В других словах: - Оценка выражения вида Таким образом, результат оператора модуля гарантированно будет неотрицательным. Однако, как вы уже заметили, компилятор Free Pascal не придерживается ISO стандартов. FPC будет возвращать правильный результат только если установлен флаг
Обратите внимание, что этот флаг влияет на определение оператора модуля в каждом модуле компиляции, поэтому RTL и все остальное, за исключением перекомпиляции, продолжает использовать другое определение внутри. Убедитесь, что Delphi и GPC (GNU Pascal Compiler) работают правильно без необходимости прыгать через уловки. Если вы хотите получить тот же результат, что и в Python, вам нужно определить и использовать свою собственную функцию (в данном случае в расширенном Паскале):
К сожалению, нет магического переключателя, чтобы заставить Free Pascal's mod работать точно так же, как Python's %. Альтернативное решениеДля получения поведения, которое совпадает с Python, можно использовать следующий подход:
Этот подход учитывает знак делителя и корректирует результат в зависимости от него, чтобы он соответствовал поведению Python.
Если вы используете Free Pascal, возможно, стоит рассмотреть использование библиотеки, которая предоставляет функции модуля, совместимые с Python. Например, можно использовать библиотеку, которая реализует функцию модуля, используя алгоритм, аналогичный тому, который используется в Python. ЗаключениеРазличия в поведении оператора модуля между Free Pascal и Python обусловлены различиями в стандартах, которые используются этими языками. Если вам нужно получить поведение, совместимое с Python, можно использовать один из предложенных выше подходов. Это позволит вам избежать неожиданных результатов и обеспечит согласованность поведения ваших программ на разных языках программирования. Context — это материал, который объясняет различие в поведении оператора модуля между Free Pascal и Python, а также предлагает методы для достижения поведения, совместимого с Python, в Free Pascal. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: Процедуры и функции ::
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |