http://baze.au.com/misc/z80bits.html#2.2
Эта?
Вид для печати
А эти?
http://www.erich-foltyn.eu/Technique...yDivision.html
и похожая
Код:;Divide 16-bit values (with 8-bit result)
;In: Divide HL by divider D
;Out: L = result, H = rest
;
Div12: ld b,8
Div12_Loop:
and a
sbc hl,de
jp p,Div12_NoAdd
add hl,de
add hl,hl
djnz Div12_Loop
ret
Div12_NoAdd:
scf
adc hl,hl
djnz Div12_Loop
ret
Destr, сдается мне, что твоя проблема не в процедурах деления, а в твоих формулах. А ну-ка выкладывай формулы в студию!
Зачем тебе представление чисел со знаком, если длина катетов и гипотенузы не может быть отрицательной?
Все правильно тебе сказал Titus: пользуйся умножением, а не делением. Если у тебя в таблице хранятся значения cos(x), на которые надо разделить - то храни в таблице обратные им числа 1/cos(x) и умножай на них, а не дели. При этом значение аргумента x в нормальных условиях никогда не должно быть таким, чтобы его косинус был равен нулю. Если у тебя оказывается, что cos(x)=0 - то в программе ошибка на более раннем этапе ее работы. Ты боишься хранить в таблице результат деления на 0, а что ты предлагаешь взамен? Делить на нуль во время работы программы? Ну-ну.
Если косинус угла равен 0 - то угол равен 90 градусам. Представь себе такой треугольник. У него два угла равны 90 градусам! Чему равна его гипотенуза? На этот вопрос нет ответа, так как такой треугольник не может существовать.
Правильно Titus говорит, проверь сначала свою программу на си или хотя бы на бейсике прежде, чем переводить ее на ассемблер. Проблему надо решать по частям. "Разделяй и властвуй". Надо стремиться локализовать ошибку. У тебя сейчас программа не работает, но ты не знаешь, где. Прекрасно, раздели ее на части. Одна часть - алгоитм умножения, вторая часть - что-то другое. Ты не знаешь, какая из частей неправильно работает. Проверяй их по отдельности. Проверяй отдельно формулы, отдельно косинус, отдельно деление и т.д. После проверки по отдельности, если убедился, что все работает - объединяй части, но постепенно. Объединил 2 из четырех частей - проверь, как они работают в паре. Только когда убедился, что пара работает полностью - добавляй в связку новые элементы.
---------- Post added at 01:26 ---------- Previous post was at 01:17 ----------
И еще один момент. Теорема Пифагора работает. Если не работает твоя программа, использующая эту теорему - значит ошибка в программе либо в постановке задачи, но не в теореме. То, что ты не смог запустить свой алгоритм через теорему Пифагора - это сигнал того, что где-то еще есть ошибки. Ищи их.
Зачем возится с катетом и гипотенузой если есть ряд Маклорена для тригонометрических функций?
Я ведь давал ссылку.
Вот ещё раз (с картинками): http://zxdn.narod.ru/coding/ig5ray3d.htm
Формулы все там, пытаюсь реализовать эту статью на практике.
Синус может :)
Верно, но такая ситуация при определённом POV (см.статью) возможна.
И программе вычисления расстояния (суть гипотенузы) в общем-то пофик с чем она имеет дело, с треугольником или ещё с кем. Она должна вычислить координаты точки (точнее точек D и E (см.картинки в статье)и уже умеет это делать, но пока ошибается в оценке этих расстояний и иногда путает какая из точек ближе).
Даже не думал ставить под сомнение.
У корня вычисляется только целая часть, потому и неприменима тут теорема Пифагора. С вычислением целой части корня я может быть ещё бы и смирился, но если ещё и дробную считать - это уже слишком жирно для Спека. Отбросил этот подход.
Не представляю как с ним обращатся (да ещё и реалтайм).
Высшая математика - не та вещь о которой я могу пренебрежительно заметить "Да это легко!" :)
Не представляю как?
(видел статью про корни http://www.zxpress.ru/article.php?id=1819 там один из способов корнеизвлечения - с табличкой, но я так и не понял как это всё работает)
Корень вычислить не так трудно. Можно вычислять побитно. Можно по таблице, а аппроксимацией между двумя соседними значениями. Можно и просто по таблице, если точность нужна невысокая. Другое дело, что от корней тоже надо уходить по возможности.
---------- Post added at 19:11 ---------- Previous post was at 19:10 ----------
И еще, любое дробное число с фиксированной точкой - это практически тоже самое, что и целое число, только сдвинутое влево и все.