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

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

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

Помогите пожалуйста вычислить функцию корень из Х без использования сопра.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.12.2010, 15:42
Ответы с готовыми решениями:

Вычисление квадратного корня
Доброго времени суток! Необходимо реализовать вычисление квадратного корня из...

Вычисление квадратного корня
Доброго дня! Подскажите 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
3321 / 1467 / 134
Регистрация: 06.10.2010
Сообщений: 3,230
19.12.2010, 15:45 2
Попробуй двоичным поиском на промежутке от 0 до X
1
Goodwin98
2522 / 818 / 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
3321 / 1467 / 134
Регистрация: 06.10.2010
Сообщений: 3,230
19.12.2010, 19:17 5
есть sqrtss
Assembler
1
2
3
cvtsi2ss xmm0,eax
sqrtss   xmm0,xmm0
cvtss2si eax,xmm0
2
Mikl___
Автор FAQ
11986 / 6253 / 596
Регистрация: 11.11.2010
Сообщений: 11,314
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
3321 / 1467 / 134
Регистрация: 06.10.2010
Сообщений: 3,230
20.12.2010, 17:58 7
Можно поробовать числа с фиксированой точкой. Только как их перемножать? Вроде бы мантиссы перемножаются, а порядок складывается. Чувствую в результате получится не программа, а "многабукаф".

Добавлено через 2 минуты
Mikl___
О - у тебя без умножения. Прокомментируй строки пожалуйста.
0
Mikl___
Автор FAQ
11986 / 6253 / 596
Регистрация: 11.11.2010
Сообщений: 11,314
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
3321 / 1467 / 134
Регистрация: 06.10.2010
Сообщений: 3,230
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