Порядок числа

Тема в разделе "WASM.A&O", создана пользователем Мановар, 21 дек 2016.

  1. Мановар

    Мановар Active Member

    Публикаций:
    0
    Регистрация:
    2 дек 2016
    Сообщения:
    143
    Mikl_, на предыдущем сайте был отличный алгоритм нахождения порядка числа (надеюсь правильно выразился). Можно привести этот алгоритм на этом сайте. А так же как по натуральному N (показатель степени) найти само число. Т.е. если N=3 число = 1000, N=6 число = 1 000 000. Как бы обратное действие.
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Порядок - десятичный логарифм числа округленный до целого вверх. Ну, а обратная операция - это просто возведение 10 в степень N.
     
  3. Мановар

    Мановар Active Member

    Публикаций:
    0
    Регистрация:
    2 дек 2016
    Сообщения:
    143
    На ассемблере, я на С++ то же выложил. Умножить 10 на N раз это просто. Может какими то сдвигами или масками. С FPU, mul,div не интересно.
     
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Мановар,
    Порядок десятичного числа ― это сколько цифр в этом числе минус 1. Порядок 137218 это 5 или [math]1,37218\times 10^{5}[/math] или [math]lg(137218)=5,1374110850436367723793306126299[/math]. Числа у нас двоичные, поэтому и логарифмы не десятичные, а двоичные. Переход от логарифма по основанию [math]a[/math] к логарифму по основанию [math]b[/math] описывается формулой [math]log_{a}(x)=\frac{1}{log_{b}(a)}\cdot log_{b}(x)[/math]
    применим эту формулу к десятичному и двоичному логарифмам от числа [math]x[/math]
    [math]lg(x)=\frac{1}{log_{2}(10)}\cdot log_{2}(x)=0,3010299956639868451190335946886\cdot log_{2}(x)[/math]
    [math]0,3010299956639868451190335946886\cdot 2^{16} = 19728,301795835041881720985661512[/math]
    19728=4D10h
    Чтобы узнать сколько в числе [math]x[/math] десятичных разрядов нужно:
    1. посчитать количество двоичных разрядов в этом числе используя команду BSR
    2. затем количество двоичных разрядов умножить на "волшебное число" 4D10h
    3. сдвинуть произведение вправо на 16 разрядов
    Код (ASM):
    1.  
    2. magic equ 4D10h
    3.         ....
    4.         fild X; загружаем целое 32-разрядное число
    5.         fabs; избавляемся от знака
    6.         fstp Y; число Y определено как tbyte
    7.         movzx eax,word ptr Y+8; двоичный порядок
    8.         sub eax,16382; из смещенного кода делаем дополнительный
    9.         imul eax,magic; умножаем двоичный порядок на волшебное число
    10.         shr eax,16; сдвигаем на 16 вправо получаем в ЕАХ десятичный порядок
    11.  
     
    Последнее редактирование: 22 дек 2016
    rococo795, Thetrik и Мановар нравится это.
  5. Мановар

    Мановар Active Member

    Публикаций:
    0
    Регистрация:
    2 дек 2016
    Сообщения:
    143
    Спасибо, завтра буду разбираться (точнее сегодня).
     
  6. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    С fst/fstp классно придумал.
     
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Это взято из Агнера Фога. Если число положительное, тогда можно
    Код (ASM):
    1. mov eax,X
    2. bsr ecx,eax; можно shr eax,1 в цикле до первой единицы
    3. inc ecx
    4. imul ecx,magic; умножаем двоичный порядок на волшебное число
    5. shr ecx,16; сдвигаем на 16 вправо получаем в ЕCХ десятичный порядок[/asm]
     
    rococo795 нравится это.
  8. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Эта тема?
     
  9. Мановар

    Мановар Active Member

    Публикаций:
    0
    Регистрация:
    2 дек 2016
    Сообщения:
    143