Mikl_, на предыдущем сайте был отличный алгоритм нахождения порядка числа (надеюсь правильно выразился). Можно привести этот алгоритм на этом сайте. А так же как по натуральному N (показатель степени) найти само число. Т.е. если N=3 число = 1000, N=6 число = 1 000 000. Как бы обратное действие.
Порядок - десятичный логарифм числа округленный до целого вверх. Ну, а обратная операция - это просто возведение 10 в степень N.
На ассемблере, я на С++ то же выложил. Умножить 10 на N раз это просто. Может какими то сдвигами или масками. С FPU, mul,div не интересно.
Мановар, Порядок десятичного числа ― это сколько цифр в этом числе минус 1. Порядок 137218 это 5 или 1,37218×105 или lg(137218)=5,1374110850436367723793306126299. Числа у нас двоичные, поэтому и логарифмы не десятичные, а двоичные. Переход от логарифма по основанию a к логарифму по основанию b описывается формулой loga(x)=1logb(a)⋅logb(x) применим эту формулу к десятичному и двоичному логарифмам от числа x lg(x)=1log2(10)⋅log2(x)=0,3010299956639868451190335946886⋅log2(x) 0,3010299956639868451190335946886⋅216=19728,301795835041881720985661512 19728=4D10h Чтобы узнать сколько в числе x десятичных разрядов нужно: посчитать количество двоичных разрядов в этом числе используя команду BSR затем количество двоичных разрядов умножить на "волшебное число" 4D10h сдвинуть произведение вправо на 16 разрядов Код (ASM): magic equ 4D10h .... fild X; загружаем целое 32-разрядное число fabs; избавляемся от знака fstp Y; число Y определено как tbyte movzx eax,word ptr Y+8; двоичный порядок sub eax,16382; из смещенного кода делаем дополнительный imul eax,magic; умножаем двоичный порядок на волшебное число shr eax,16; сдвигаем на 16 вправо получаем в ЕАХ десятичный порядок
Это взято из Агнера Фога. Если число положительное, тогда можно Код (ASM): mov eax,X bsr ecx,eax; можно shr eax,1 в цикле до первой единицы inc ecx imul ecx,magic; умножаем двоичный порядок на волшебное число shr ecx,16; сдвигаем на 16 вправо получаем в ЕCХ десятичный порядок[/asm]