Показать сообщение отдельно
  #1 (permalink)  
Старый 17.03.2015, 23:58
Аватар для Paguo-86PK
Профессор
Отправить личное сообщение для Paguo-86PK Посмотреть профиль Найти все сообщения от Paguo-86PK
 
Регистрация: 16.09.2009
Сообщений: 253

Заготовка для ассемблера: Извлечение корня
Занялся я алгоритмам возведения числа в квадрат и извлечения квадратного корня для 8-битной ЭВМ. Начал гуглить на эту тему, попалась статья для Z80. Однако, ожидаемого там не нашёл. Просто подготовка таблиц сложением нечётных чисел.

Взялся я в JS отладить собственный вариант.
Возведение в квадрат отладил, работает.
А вот извлечение корня - даёт сбой.
Причём, обе функции практически одинаковы, за исключением противоположных действий.

Помню, я долго искал в сети алгоритм нахождения точки пересечения двух отрезков. А когда написал сам, тогда и нашёл готовую.
Вот и сейчас, видимо, плохо ищу...
Тут используется умножение, Вообще не подходит.

Если можете, помогите...
<html>
<script>
function square(n) {
	var
		m = 1, // Mask
		r = 1, // Result
		t = n, // Temp
		h, // 1/2 of square
		q; // 1/4 of square
	if(!n)
		return 0;
	while(t >>= 1)
		m <<= 1, r <<= 2;
	h = r >> 1, q = h >> 1;
	while(m >>= 1) {
		if(n & m)
			r += h + h + q, h += q;
		h >>= 1, q >>= 2;
	}
	return r;
}
function root(n) {
	var
		m = 1,	// Mask
		r = 0,	// Result
		s = 0;	// Shift
	++ n;
	while(n >> (s + 1))
		++ s;
	m <<= s & -2;
	do {
		s = r + m, r >>= 1;
		if(s < n)
			n -= s, r |= m;
	} while(m >>= 2);
	return r;
}
function squares(m, n) {
	var
		i, s, r, d = [];
	for(i = m; i <= n; ++ i) {
		s = square(i);
		r = root(s)
		if(i != r)
			d.push(i + "<sup>2</sup>=" + s + "<sup><sup>1/2</sup></sup>=" + r);
	}
	return d;
}
function main() {
	document.getElementsByTagName("pre")[0].innerHTML = squares(0,100).join("<br>");
}
</script>
<body onload='main()'>
<pre>
</pre>
</body>

Последний раз редактировалось Paguo-86PK, 19.03.2015 в 08:55. Причина: Вылечил алгоритм
Ответить с цитированием