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

Функция возведения в степень

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



Автор: Александр
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> 
альтернатива Math.Power

Зависимости: их нет
Автор:       Александр
Copyright:   Александр
Дата:        12 сентября 2003 г.
***************************************************** }

function Degree(const DegBasis, DegParam: Extended): Extended;
asm
        // Вход: DegBasis, DegParam --> в стеке
        // Выход: Result(= DegParam в случае некорректных данных) --> ST(0)

        FLD DegParam
        FLDZ
        FCOMIP ST, ST(1)
        JNZ @@DegParam_is_not_0
        FFREE ST
        FLD1
        JMP @@exit
@@DegParam_is_not_0:
        JNC @@DegParam_is_less_than_0
        XOR EAX, EAX
        JMP @@cmp_DegBasis_to_0
@@DegParam_is_less_than_0:
        OR EAX, 1
@@cmp_DegBasis_to_0:
        FLD DegBasis
        FLDZ
        FCOMIP ST, ST(1)
        JNZ @@DegBasis_is_not_0
        TEST EAX, 1
        JZ @@DegParam_is_greater_than_0
        FSTP ST
        JMP @@exit
@@DegParam_is_greater_than_0:
        FSTP ST(1)
        JMP @@exit
@@DegBasis_is_not_0:
        JC @@DegBasis_is_greater_than_0
        FABS
        FXCH
        OR EAX, 1
        FLD ST
        FRNDINT
        FSUB ST, ST(1)
        FLDZ
        FCOMIP ST, ST(1)
        FSTP ST
        JZ @@DegParam_is_integer
        FLD1
        FDIV ST, ST(1)
        FABS
        FLD1
        FCOMIP ST, ST(1)
        JC @@Abs_1_div_DegParam_greater_than_1
        FSTP ST
        FSTP ST(1)
        JMP @@exit
@@Abs_1_div_DegParam_greater_than_1:
        FISTP QWORD PTR @@Int_64
        TEST BYTE PTR @@Int_64, 1
        JNZ @@change_a_sign_at_the_and_of_calculations
        FSTP ST(1)
        JMP @@exit
@@DegParam_is_integer:
        FLD ST
        FISTP QWORD PTR @@Int_64
        TEST BYTE PTR @@Int_64, 1
        JNZ @@change_a_sign_at_the_and_of_calculations
        XOR EAX, EAX
@@change_a_sign_at_the_and_of_calculations:
        FXCH
@@DegBasis_is_greater_than_0:
        FYL2X
        FLD ST
        FRNDINT
        FSUB ST(1), ST
        FXCH
        F2XM1
        FLD1
        FADD
        FSCALE
        FSTP ST(1)
        TEST EAX, 1
        JZ @@exit
        FCHS
        JMP @@exit
@@Int_64:
        DQ 0
@@exit:
        FWAIT

end;

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

Degree(-8, 1 / 3) = -2

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

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

Вот разбивка кода:

  1. Функция Degree принимает два параметра: DegBasis (основу) и DegParam (экспоненту).
  2. Функция сначала проверяет, является ли экспонента нулевой. Если это так, функция возвращает 1.
  3. Если экспонента не нулевая, функция проверяет, является ли она отрицательной. Если это так, функция берет абсолютное значение экспоненты и меняет местами основу и экспоненту.
  4. Функция затем вычисляет степень с помощью следующих шагов:
    • Если основа равна нулю, функция возвращает код ошибки (1).
    • Если основа положительная, функция использует цикл для вычисления степени, повторно умножая результат на основу.
    • Если основа отрицательная и экспонента четная, функция вычисляет степень с помощью формулы base^exponent = (base^((exponent/2)+0.5))^2.
    • Если основа отрицательная и экспонента нечетная, функция вычисляет степень с помощью комбинации шагов выше.
  5. Функция возвращает рассчитанный результат.

Пример использования показывает, что функция правильно обрабатывает случаи, когда основа отрицательна и экспонента не целая.

Вот некоторые предложения по улучшению: 1. Функцию можно сделать более эффективной, уменьшив количество операций с вещественными числами. 2. Обработка ошибок может быть улучшена для предоставления более конкретных сообщений об ошибках или кодов. 3. Функцию можно модифицировать для обработки комплексных чисел в качестве входных данных. 4. Документация функции может быть более подробной, чтобы объяснить логику и краевые случаи.

В целом, это хорошо написанная функция, которая демонстрирует хороший уровень понимания программирования на ассемблере в Delphi.

Функция возведения в степень - это альтернатива Math.Power, реализованная на языке Delphi с использованием ассемблерного кода.


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

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




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-04-26 17:10:14/0.0033059120178223/0