Форум программистов, компьютерный форум, киберфорум
AlexSky-coder
Войти
Регистрация
Восстановить пароль
Оценить эту запись

Факториал на делфи (asm)

Запись от AlexSky-coder размещена 24.05.2020 в 17:40

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function factorial(n:integer):integer;
label lp;
begin
    asm
        mov  EBX, 1
        mov  ECX, n
        mov  EDX, 1
    lp:
        mov  EAX, EBX
        imul EDX
        mov  EDX, EAX
        add  EBX,1
        loop lp
        mov  result, eax
    end;
end;
При значениях n<1 функция зависает, а если n>12 то через переполнение выдает не верный результат.
Размещено в Без категории
Показов 1964 Комментарии 11
Всего комментариев 11
Комментарии
  1. Старый комментарий
    Аватар для OwenGlendower
    В чем практическая польза этого кода? Скорость вычисления?
    Запись от OwenGlendower размещена 25.05.2020 в 09:47 OwenGlendower вне форума
  2. Старый комментарий
    Аватар для AlexSky-coder
    Цитата:
    Сообщение от OwenGlendower Просмотреть комментарий
    В чем практическая польза этого кода? Скорость вычисления?
    Да, регистры работают быстрее чем оперативная память. Код я делал больше для саморазвития, чем для практики.
    Запись от AlexSky-coder размещена 25.05.2020 в 12:46 AlexSky-coder вне форума
  3. Старый комментарий
    Получается быстрее, чем просто из таблички вернуть результат?
    Запись от politoto размещена 25.05.2020 в 14:42 politoto вне форума
  4. Старый комментарий
    Аватар для AlexSky-coder
    Цитата:
    Сообщение от politoto Просмотреть комментарий
    Получается быстрее, чем просто из таблички вернуть результат?
    Если функция вызывается "миллион раз в наносекунду", и там большие числа, то лучше табличку. Но табличку тоже нужно заполнить.
    Запись от AlexSky-coder размещена 25.05.2020 в 18:06 AlexSky-coder вне форума
  5. Старый комментарий
    Табличку из 12-13 чисел можно заполнить во время компиляции.
    Макросами или копипастом.
    Запись от politoto размещена 26.05.2020 в 09:03 politoto вне форума
  6. Старый комментарий
    Аватар для Avazart
    Да логичнее реализовывать длинную арифметику и на ней вычислять факториал (что бы не было ограничение на <13!) и его оптимизировать на асме.
    Запись от Avazart размещена 26.05.2020 в 12:28 Avazart вне форума
  7. Старый комментарий
    Аватар для CoderHuligan
    Вот код на Tcl, который вычисляет например факториал 200! мгновенно. А еще говорят Tcl медленный..
    Ruby
    1
    2
    
    proc tcl::mathfunc::fac x {expr {$x < 2? 1: $x * fac($x-1)}}
    expr fac(200)
    Результат:
    78865786736479050355236321393218506229513597768717326329474253324435944996340334 29203042840119846239041772121389196388302576427902426371050619266249528299311134 62857270763317237396988943922445621451664240254033291864131227428294853277524242 40757390324032125740557956866022603190417032406235170085879617892222278962370389 7374720000000000000000000000000000000000000000000000000
    Запись от CoderHuligan размещена 26.05.2020 в 17:56 CoderHuligan вне форума
  8. Старый комментарий
    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    Да логичнее реализовывать длинную арифметику и на ней вычислять факториал (что бы не было ограничение на <13!) и его оптимизировать на асме.
    Если бы не было готовых оптимизированных библиотек длинной арифметики или языков со встроенной длинной арифметикой.
    Запись от politoto размещена 26.05.2020 в 20:34 politoto вне форума
  9. Старый комментарий
    Цитата:
    Вот код на Tcl, который вычисляет например факториал 200! мгновенно..
    python тоже справляется
    Код:
    >>> import math
    >>> math.factorial ( 200 )
    788657867364790503552363213932185062295135977687173263294742533244359449963403342920304284011984623904177212138919638830257642790242637105061926624952829931113462857270763317237396988943922445621451664240254033291864131227428294853277524242407573903240321257405579568660226031904170324062351700858796178922222789623703897374720000000000000000000000000000000000000000000000000
    Запись от politoto размещена 26.05.2020 в 20:36 politoto вне форума
  10. Старый комментарий
    Аватар для Avazart
    Цитата:
    Если бы не было готовых оптимизированных библиотек длинной арифметики или языков со встроенной длинной арифметикой.
    Не "Если" а "Для", для обучения.

    Кроме того иногда хочится иметь свою библиотеку со своим интерфейсом и без необходимости таскать dll.
    И тем более не таскать интерпретатор ...
    Запись от Avazart размещена 27.05.2020 в 11:33 Avazart вне форума
    Обновил(-а) Avazart 27.05.2020 в 11:37
  11. Старый комментарий
    Оптимизировать нужно частные случаи.
    Если в лоб написанную процедуру умножения применять для вычисления факториалов больших чисел, то много времени уйдет на умножение 0 на 0.

    Если, например, хочется точно вычислять вероятности раскладов колоды из 52 карт, то можно сформировать таблицу разложения чисел до 52 ( или до 104 ) на простые множители и вместо умножения и деления складывать и вычитать показатели. А "цифры" вычислять, только когда взамнопростые числа приходится вычитать или складывать, а не умножить или делить.
    Запись от politoto размещена 27.05.2020 в 12:47 politoto вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru