Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.03.2009, 17:39   #1
6AZblJlb
Пользователь
 
Аватар для 6AZblJlb
 
Регистрация: 04.12.2008
Сообщений: 46
По умолчанию Вычисление квадратного корня вручную

Вычислить квадратный корень двубитного числа....беззнакового...но не используя fsqrt......чтот о пытался написать но не получилось......Подскажите че нить....
Будь проще, и у тебя будет меньше делителей.
6AZblJlb вне форума Ответить с цитированием
Старый 15.03.2009, 18:45   #2
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

Например, так: http://www.programmersforum.ru/showp...47&postcount=7
функция на Паскале, на Асму переводите сами
_Dmitry вне форума Ответить с цитированием
Старый 15.03.2009, 19:09   #3
6AZblJlb
Пользователь
 
Аватар для 6AZblJlb
 
Регистрация: 04.12.2008
Сообщений: 46
По умолчанию

спс я тут сам кое что написал....тупо подбором.....но вот при значении 65535 макс значение ктоорое в два байта залазит это получается уже -1 и вот что делать с этим я не в курсе((((
х ввод два байта
z вывод 1 байт

Код:
	mov cl,0
	mov bx,x
m2:
	mov zf,0
	add cl,1
	mov al,cl
	mul al
	cmp ax,bx
	jg m1
	je m3
	;add cl,1
	jl m2
m1 :
    sub cl,1
    mov z,cl
m3 :
    mov z,cl
Будь проще, и у тебя будет меньше делителей.
6AZblJlb вне форума Ответить с цитированием
Старый 15.03.2009, 19:23   #4
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

пиши 32 битную прогу с использованием 32 битных регистров
rpy3uH вне форума Ответить с цитированием
Старый 15.03.2009, 19:39   #5
6AZblJlb
Пользователь
 
Аватар для 6AZblJlb
 
Регистрация: 04.12.2008
Сообщений: 46
По умолчанию

не тут так не получится...у нас задачи на сервер отправлять надо а там автоматическая проверка....так в условии размерность переменных описана!(((....да и я не в курсе как с ними работать с такими регистрами
Будь проще, и у тебя будет меньше делителей.

Последний раз редактировалось 6AZblJlb; 15.03.2009 в 19:41.
6AZblJlb вне форума Ответить с цитированием
Старый 16.03.2009, 12:48   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
но не используя fsqrt
Только из-за размерности?
Так ведь можно использовать, просто потом как-то округлять.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.04.2009, 17:09   #7
Ukrajinec
 
Регистрация: 06.04.2009
Сообщений: 7
По умолчанию

SHR
Сдвиг логический операнда вправо
ASCII-коррекция после сложения
Схема команды: shr операнд,кол-во_сдвигов
Назначение: логический сдвиг операнда вправо.
Синтаксис
Алгоритм работы:

сдвиг всех битов операнда вправо на один разряд; при этом выдвигаемый справа бит становится значением флага переноса cf;
одновременно слева в операнд вдвигается нулевой бит;
указанные выше два действия повторяются количество раз, равное значению второго операнда.

При сдвиге битов операнда вправо на 1 розряд, это тоже самое что взять число под корень квадратный.
Ukrajinec вне форума Ответить с цитированием
Старый 16.11.2011, 01:31   #8
Legioner24
Новичок
Джуниор
 
Регистрация: 16.11.2011
Сообщений: 2
Восклицание

Цитата:
Сообщение от Ukrajinec Посмотреть сообщение
При сдвиге битов операнда вправо на 1 розряд, это тоже самое что взять число под корень квадратный.
Ukrajinec ты зачем такоэ пишешь? Сдвиг вправо на один - это то же самое что и деление на два.. (х div 2) Сравни : корень квадратный из 9 = 3, но 9 shr 1 = 4 !
Legioner24 вне форума Ответить с цитированием
Старый 16.11.2011, 04:02   #9
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

1) Самый известный целочисленный алгоритм для вычисления квадратного корня из числа поражает своей простотой
Код:
    unsigned sqrt_cpu_int(usigned X)
    {    unsigned div = 1, result = 0; 
        while (X > 0)
        {    X -= div;
              div += 2;
              result += X < 0 ? 0 : 1;     
         }
        return result; 
    }
Недостаток данного алгоритма - количество итераций будет увеличиваться с ростом Х
2) вычисление квадратного корня по разложению в ряд Тейлора.
Пусть Х - любое число; f(X) - некоторая функция, зависящая от X; a - известное число, близкое к Х; f(a) - известное значение функции.
Разложим f(X) в ряд Тейлора:
f(X)=f(a)+(X-a)f '(a)+((X-a)² ×f" (a))/2! + ... + ((X-a)ⁿ ×fⁿ (a))/n!
Пусть X - число, из которого нужно извлечь корень. Тогда f(X)=√X; a - известное число близкое к X; f(a)=√a - известное число близкое к √X, и f(X)=√a +(X-a)/(2√a)+...=
=(2a+X-a)/(2√a)=(a+X)/(2√a)
Величина √X может быть найдена, если задаться величиной √a и затем вычислить f(X). f(X)² можно сравнить с исходным числом Х. Если точность окажется недостаточной, тогда число а заменяется на f(X)², √a на f(X) и вычисление повторяется
3) поиск целочисленного квадратного корня методом Ньютона начинается с некоторого значения g0, которое является начальной оценкой √X. Затем выполняется серия уточнений значения квадратного корня по формуле gn+1=(gn+X/gn)/2. Для уменьшения количество итераций можно на первом этапе более точно подобрать начальное значения для переменной g0
Код:
{ usigned x1;
  int a, g0, g1;
  if ( x <= 1 ) return x;
  a = 1;
  x1 = x - 1;
  if (x1 > 65535) {a = a + 8; 
                        x1 = x1 >> 16;
                        }
  if (x1 > 255)   {a = a + 4;
                       x1 = x1 >> 8;
                      }
  if (x1 > 15)    {a = a + 2; 
                       x1 = x1 >> 4;
                      }
  if (x1 > 3)     a = a + 1;
  g0 = 1 << a; // g0 = 2ª
  g1 = (g0 + (x >> a)) >> 1;
  while (g1 < g0) // повторяем, пока приближения строго уменьшаются
  { g0 = g1; 
     g1 = (g0 + (x/g0)) >> 1;
   }
}
4) Так как деление достаточно медленная операция, можно от нее отказаться. Для вычисления квадратного корня используем умножение. 32-разрядное число Х будет иметь 16-разрядный квадратный корень. На каждом шаге происходит уточнение 1 бита значения корня. Для ускорения сделано "безбранчевое" вычисление прибавить или отнять значение в соответствующем разряде
Код:
    mov ebx,4000h
    mov ecx,8000h
    mov eax,40000000h
@@:    cmp eax,X
    je @f; преждевременный выход из цикла
    sbb edx,edx; если CF=1 тогда edx=0FFFFFFFFh иначе edx=0
    sub ecx,ebx
    and edx,ebx; если CF=1 тогда edx=ebx иначе edx=0
    lea ecx,[ecx+edx*2]; если CF=1 тогда ecx=ecx+ebx иначе ecx=ecx-ebx
    shr ebx,1; переходим к следующему разряду
    mov eax,ecx
    mul eax; получаем "eax в квадрате"
    test ebx,ebx
    jnz @b
@@:    mov eax,ecx; eax:=sqrt(X)
5) алгоритм описан аж в 1945 в Von Neumann J. "First Draft of a Reaport on the EDVAC" переложение на 32-разрядные регистры моё
Код:
        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

Последний раз редактировалось Mikl___; 16.11.2011 в 07:05.
Mikl___ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите пожалуйста написать програмку для вычисления квадратного корня ! срочно !!! ylvia Помощь студентам 7 20.02.2012 19:29
Длинная арифметика (Нахождение квадратного корня) 08ekhiv1 Помощь студентам 6 06.03.2009 15:48
Вычислить приближенное значение корня asd48 Помощь студентам 9 03.12.2008 21:16
Копирование *.exe вручную v01umE Общие вопросы C/C++ 4 06.07.2008 20:06
Вычисление корня уравнения методом деления отрезка пополам Absent Помощь студентам 12 25.11.2007 17:54