Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: математика, вычисления
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.65
Хитрый_КОТ
3 / 3 / 1
Регистрация: 21.11.2010
Сообщений: 30
#1

Вычисление квадратного корня из числа без использования сопроцессора - Assembler

19.12.2010, 15:42. Просмотров 2274. Ответов 8
Метки нет (Все метки)


http://www.cyberforum.ru/assembler-math/thread170673.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.12.2010, 15:42
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Вычисление квадратного корня из числа без использования сопроцессора (Assembler):

Вычисление квадратного корня
Доброго дня! Подскажите WinAPI функцию для вычисления квадратного корня. Если...

вычисление квадратного корня из 16разрядного числа
Доброго времени суток! нужна помощь в создании программы на TASM. Цель:...

Вычисление квадратного корня
Помогите составить программы: 1) решение данной функции y=корень из x; 2)...

TASM. Программирование сопроцессора. Вычисление выражения
Есть несколько выражений: 1) Y=arctg(ln(x)/2) 2) Y=tg(x*x/4+x/2+1) 3)...

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

8
murderer
3314 / 1461 / 133
Регистрация: 06.10.2010
Сообщений: 3,215
19.12.2010, 15:45 #2
Попробуй двоичным поиском на промежутке от 0 до X
1
Goodwin98
2521 / 817 / 10
Регистрация: 31.05.2009
Сообщений: 1,672
19.12.2010, 15:56 #3
Вот такое например нашел. Вычисляет целую часть квадратного корня.
Assembler
1
2
3
4
5
6
7
8
9
10
11
        xchg    bx,ax          ; Сохраняем AX в BX
        mov dx,8000h       ; DH = маска с установленным битом, DL = результат
@@NextBit:  xor dl,dh          ; Устанавливаем в DL очередной бит (с помощью маски)
        mov al,dl          ; Записываем результат в AL
        mul al             ; AX = AL*AL (возводим в квадрат)
        cmp ax,bx          ; Сравниваем результат с исходным числом
        jna @@DontReset    ; Если результат больше, то...
        xor dl,dh          ; Сбрасываем установленный ранее бит
@@DontReset:    shr dh,1           ; Переходим к следующему биту
        jnz @@NextBit      ; Если они (биты) не кончились, повторяем
        xchg    ax,dx          ; Иначе записываем результат в AX
0
Хитрый_КОТ
3 / 3 / 1
Регистрация: 21.11.2010
Сообщений: 30
19.12.2010, 19:10  [ТС] #4
А нет такой команды вроде fsqrt, только для региста eax например?
0
murderer
3314 / 1461 / 133
Регистрация: 06.10.2010
Сообщений: 3,215
19.12.2010, 19:17 #5
есть sqrtss
Assembler
1
2
3
cvtsi2ss xmm0,eax
sqrtss   xmm0,xmm0
cvtss2si eax,xmm0
2
Mikl___
Автор FAQ
11363 / 5906 / 534
Регистрация: 11.11.2010
Сообщений: 10,932
20.12.2010, 09:23 #6
Хитрый_КОТ, без использования FPU и естественно результат целочисленный
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    mov ebp,X
    inc ebp
    bsr ecx,ebp
    and ecx,-2
    mov ebx,1
    shl ebx,cl;для уменьшения количества итераций 
    xor eax,eax
@@: lea ecx,[eax+ebx]
    shr eax,1
    cmp ecx,ebp
    sbb edx,edx
    mov edi,edx
    and edx,ecx
    sub ebp,edx
    and edi,ebx
    or eax,edi
    shr ebx,2
    jnz @b
возвращает EAX =√X для 32-разрядного корня за максимум 16 итераций (зависит от величины Х)
0
murderer
3314 / 1461 / 133
Регистрация: 06.10.2010
Сообщений: 3,215
20.12.2010, 17:58 #7
Можно поробовать числа с фиксированой точкой. Только как их перемножать? Вроде бы мантиссы перемножаются, а порядок складывается. Чувствую в результате получится не программа, а "многабукаф".

Добавлено через 2 минуты
Mikl___
О - у тебя без умножения. Прокомментируй строки пожалуйста.
0
Mikl___
Автор FAQ
11363 / 5906 / 534
Регистрация: 11.11.2010
Сообщений: 10,932
21.12.2010, 04:28 #8
murderer, да чего там комментировать это переложение на ассемблер
C
1
2
3
4
5
6
7
8
9
10
int isqrt4(unsigned x) {   unsigned m, y, b;
   m = 0x40000000;
   y = 0;
   while(m != 0) {              // Do 16 times.
      b = y | m;
      y = y >> 1;
      if (x >= b) {  x = x - b; y = y | m; }
      m = m >> 2;
   }
   return y;
Причем алгоритм был описан аж в 1945 в Von Neumann J. "First Draft of a Reaport on the EDVAC"
1
murderer
3314 / 1461 / 133
Регистрация: 06.10.2010
Сообщений: 3,215
22.12.2010, 15:49 #9
Нашёл тупой, но очень простой алгоритм
Для квадратов чисел верны следующие равенства:
1 = 1*1
1 + 3 = 2*2
1 + 3 + 5 = 3*3

и так далее.

То есть, узнать целую часть квадратного корня числа можно, вычитая из него все нечётные числа по порядку, пока остаток не станет меньше следующего вычитаемого числа или равен нулю, и посчитав количество выполненных действий. Например, так:
9 − 1 = 8
8 − 3 = 5
5 − 5 = 0

Выполнено 3 действия, квадратный корень числа 9 равен 3.
Реализация
Delphi
1
2
3
4
5
6
7
8
9
10
function sqrt(x: integer): dword;assembler;register;
asm
  mov edx,-1
  @1:add edx,2
     sub eax,edx
  jnle @1
  sbb edx,-1
  shr edx,1
  mov eax,edx
end;
0
22.12.2010, 15:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2010, 15:49
Привет! Вот еще темы с решениями:

Запись и чтение числа в/из сопроцессора
...доброго времени суток, уважаемые форумчане...посоветйте, плиз, литературу,...

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

Итеративное вычисление корня сопроцессором
Здравствуйте, уважаемые. Необходимо сопроцессором вычислить квадратный корень...

Вычисление квадратного корня из числа (без использования стандартных математических функций)
Напишите программу, вычисляющую квадратный корень из числа (не пользуясь...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru