Занялся я алгоритмам возведения числа в квадрат и извлечения квадратного корня для 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>